Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.04.28;
Скачать: CL | DM;

Вниз

Сравнить два пути к файлу.   Найти похожие ветки 

 
Rouse_ ©   (2012-10-16 14:58) [40]


> QAZ2   (16.10.12 12:42) [30]
> и сказал википед про hardlink

Ну ты нашел авторитетный источник, еще бы в лурке поискал :)
Я ж сказал - напиши код и проверь, че катать с пустого в порожнее?


 
QAZ5   (2012-10-16 15:03) [41]

дык я не понял че писать, ты привел некошерную функцию ее нет в мсдн


 
Дмитрий С ©   (2012-10-16 16:08) [42]


> NtQueryObject

[This function may be changed or removed from Windows without further notice.]


 
MetalFan ©   (2012-10-16 16:17) [43]


> ты привел некошерную функцию ее нет в мсдн

Гы, а MSDN и не в курсе, что в ней не описана <a href="http://msdn.microsoft.com/en-us/library/bb432383%28v=VS.85%29.aspx">эта функция</a>.


 
MetalFan ©   (2012-10-16 16:18) [44]

...мать... забыл, что тут ссылки так не вставишь.


 
Rouse_ ©   (2012-10-16 16:42) [45]


> QAZ5   (16.10.12 15:03) [41]
> дык я не понял че писать, ты привел некошерную функцию ее
> нет в мсдн

Так ты еще и MSDN не смотришь, ну оно и понятно, есть же википедия :)))
Заканчивай тролить, займись полезным делом.


 
QAZ5   (2012-10-16 16:46) [46]

Удалено модератором
Примечание: я буду учить матчасть прежде чем писать глупости...


 
брат Птибурдукова   (2012-10-16 17:08) [47]

так вот чем твой ум разрушили...


 
Дмитрий С ©   (2012-10-16 17:26) [48]

Кстати, а реально какими документрированными (и такими, которые не могут выкинуть без предупреждения) функциями можно узнать путь к файлу по его хендлу? так чтобы и в ХП работало.


 
QAZ5   (2012-10-16 17:46) [49]

Удалено модератором


 
asail ©   (2012-10-16 23:12) [50]

Удалить первый файл, если второй тоже удалился, значит один и тот-же... :)


 
Inovet ©   (2012-10-17 00:59) [51]

> [50] asail ©   (16.10.12 23:12)

С хардлинком второй останется.


 
Германн ©   (2012-10-17 01:32) [52]


> Inovet ©   (17.10.12 00:59) [51]
>
> > [50] asail ©   (16.10.12 23:12)
>
> С хардлинком второй останется.
>

Вот я и говорил, что вопрос неоднозначно сформулирован. И объяснений от автора так и не прозвучало. Что автор подразумевает под словами "один и тот же файл"? Поскольку это может означать как эквивалентность, так и уникальность. А это две большие разницы.


 
kilkennycat ©   (2012-10-17 02:42) [53]


> Что автор подразумевает под словами "один и тот же файл"?

данная фраза трактуется однозначно. это один и тот же файл. его копия в другом месте(под другим именем и т.д.) - это копия, другой файл. а вот если этот файл лежит в одной папке, а потом его переместили в другую - это один и тот же файл, при условии, что файловая система лишь поменяла ссылки. а вот если файловая система его при перемещении переписала на новое физическое место - это другой файл.
именно поэтому телепортация (когда будет сделана), будет использоваться лишь для перемещения чего-нить незначительного, ибо фактически, а значит есть риск, что и юридически вещи и организмы не будут признаны одними и теми же до телепортации и после. но это конечно, если метод телепортации будет в виде уничтожения плазмой (в дешевых плацкартных вариантах - прессом) отправляемого и воссоздании его заново в пункте приема. а вот если его атомы не нарушая структуры через тридесятое измерение и пару складок пространства перенесутся - то все ок, это один и тот же объект. или субъект. или файл.


 
Германн ©   (2012-10-17 03:09) [54]


> kilkennycat ©   (17.10.12 02:42) [53]
>
>
> > Что автор подразумевает под словами "один и тот же файл"?
>
>
> данная фраза трактуется однозначно.

И это говорит Костя, которого не понятно где и как искать! :)


 
kilkennycat ©   (2012-10-17 10:29) [55]


> Германн ©   (17.10.12 03:09) [54]

квип или аська, я почти всегда онлайн


 
QAZ5   (2012-10-17 12:53) [56]


> это один и тот же файл, при условии, что файловая система лишь поменяла ссылки

тогдабы проканало [13] , но индексы могут менятся на усмотрение фс

> а вот если файловая система его при перемещении переписала
> на новое физическое место - это другой файл.

а как по твоему происходит дефрагментация диска? :)


 
kilkennycat ©   (2012-10-17 15:25) [57]

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


 
Jeer ©   (2012-10-17 15:41) [58]

Напридумывали заразной хрени всякой - теперь лечись :)


 
Rouse_ ©   (2012-10-17 16:09) [59]


> Дмитрий С ©   (16.10.12 17:26) [48]
> Кстати, а реально какими документрированными (и такими,
> которые не могут выкинуть без предупреждения) функциями
> можно узнать путь к файлу по его хендлу? так чтобы и в ХП
> работало.

Я ж сказал, NtQueryObject.

А по поводу хардлинков, все файлы в NTFS представлены в виде блока данных где-то в недрах диска + Хардлинк на эти данные, что собственно видно при вызове NtQueryInformationFile с флагом FileStandardInformation, где поле FileInfo.NumberOfLinks будет равно единице. Для примера тот-же калькулятор.
У меня он лежит в оригинале вот тут:
C:\Windows\winsxs\x86_microsoft-windows-calc_31bf3856ad364e35_6.1.7601.17514_none_abc56b2678fe1108\calc.exe + на него висит хардлинк в C:\Windows\System32\calc.exe

симлинки/subst диски NtQueryObject кажет ровно.

Вот такой код:

program Project1;

{$APPTYPE CONSOLE}

uses
 Windows;

type
 NT_STATUS = Cardinal;

 PUNICODE_STRING = ^TUNICODE_STRING;
 TUNICODE_STRING = packed record
   Length : WORD;
   MaximumLength : WORD;
   Buffer : array [0..MAX_PATH - 1] of WideChar;
 end;

 POBJECT_NAME_INFORMATION = ^TOBJECT_NAME_INFORMATION;
 TOBJECT_NAME_INFORMATION = packed record
   Name : TUNICODE_STRING;
 end;

 function NtQueryObject(ObjectHandle: THandle;
   ObjectInformationClass: DWORD; ObjectInformation: Pointer;
   ObjectInformationLength: ULONG;
   ReturnLength: PDWORD): NT_STATUS; stdcall; external "ntdll.dll";

function GetFilePathByHandle(Value: THandle): string;
const
 ObjectNameInformation = 1;
var
 ObjectNameInfo: TOBJECT_NAME_INFORMATION;
 dwReturn: DWORD;
 AnsiBuff: array [0..MAX_PATH - 1] of AnsiChar;
begin
 NtQueryObject(Value, ObjectNameInformation,
   @ObjectNameInfo, MAX_PATH * 2, @dwReturn);
 WideCharToMultiByte(CP_ACP, 0,
   @ObjectNameInfo.Name.Buffer[ObjectNameInfo.Name.MaximumLength -
   ObjectNameInfo.Name.Length],
   ObjectNameInfo.Name.Length, @AnsiBuff[0],
   MAX_PATH, nil, nil);
 Result := string(PAnsiChar(@AnsiBuff[0]));
end;

var
 RealFile, HardLink, SymLink, SubStFile: THandle;
begin
 RealFile := CreateFile("S:\tmp\1\1.txt",
   GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
 Writeln(GetFilePathByHandle(RealFile));
 CloseHandle(RealFile);

 HardLink := CreateFile("S:\tmp\1\2\1.txt",
   GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
 Writeln(GetFilePathByHandle(HardLink));
 CloseHandle(HardLink);

 SymLink := CreateFile("S:\tmp\1\4\1.txt",
   GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
 Writeln(GetFilePathByHandle(SymLink));
 CloseHandle(SymLink);

 SubStFile := CreateFile("J:\1.txt",
   GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
 Writeln(GetFilePathByHandle(SubStFile));
 CloseHandle(SubStFile);

 Readln;
end.


выведет следующую информацию

\Device\HarddiskVolume3\tmp\1\1.txt
\Device\HarddiskVolume3\tmp\1\2\1.txt
\Device\HarddiskVolume3\tmp\1\1.txt
\Device\HarddiskVolume3\tmp\1\1.txt


Сбой только на хардлинке (второй результат), но его легко дереференсить при желании, и кстати GetFinalPathNameByHandle не производит дереференс хардлинка, т.е. им нельзя будет различить что два пути ведут на один и тот-же файл.


 
QAZ5   (2012-10-17 17:36) [60]


> Сбой только на хардлинке (второй результат), но его легко
> дереференсить при желании, и кстати GetFinalPathNameByHandle
> не производит дереференс хардлинка, т.е. им нельзя будет
> различить что два пути ведут на один и тот-же файл.

а я чо говорил


 
Rouse_ ©   (2012-10-17 18:00) [61]


> а я чо говорил

А ты говорил неверные вещи, причем цитировал зачем-то википедию, а потом вообще про драйвера начал (зачем?), при дереференсе можно конкретно определить оригинальное месторасположение файла на которое указывает рутовый линк.


 
QAZ5   (2012-10-17 20:07) [62]

закеш как


 
Rouse_ ©   (2012-10-17 20:56) [63]


> QAZ5   (17.10.12 20:07) [62]
> закеш

Не закежу :)
В семерке отрубили запрос FSCTL_GET_NTFS_FILE_RECORD для неподписаных приложений.
http://msdn.microsoft.com/en-us/library/windows/desktop/aa364568(v=vs.85).aspx
А сидеть вспоминать как читать NTFS в сыром режиме мне лениво :)


 
Rouse_ ©   (2012-10-17 21:02) [64]

За, если интересно, то вот вариант с нулевого кольца: http://www.everfall.com/paste/id.php?uj1hth7un53o
под ХР он транслируется легко в третье.
Под семеркой связку ZwFsControlFile -> DeviceIoControl меняем на RAW


 
QAZ5   (2012-10-17 22:01) [65]


> RAW

какой такой


 
Германн ©   (2012-10-18 01:55) [66]


>  QAZ5   (17.10.12 22:01) [65]
>
>
> > RAW
>
> какой такой
>

Придуриваешься или в самом деле не понимаешь о чем речь?


 
QAZ5   (2012-10-18 11:39) [67]

не ну догадываюсь, но надо конкретики



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

Текущий архив: 2013.04.28;
Скачать: CL | DM;

Наверх




Память: 0.6 MB
Время: 0.009 c
2-1350293913
Дмитрий С
2012-10-15 13:38
2013.04.28
Сравнить два пути к файлу.


15-1356726602
Юрий
2012-12-29 00:30
2013.04.28
С днем рождения ! 29 декабря 2012 суббота


15-1356521593
brother
2012-12-26 15:33
2013.04.28
порезать файл XML


15-1356681047
Dmitry1987
2012-12-28 11:50
2013.04.28
Verisign vs GlobalSign


15-1356381002
Юрий
2012-12-25 00:30
2013.04.28
С днем рождения ! 25 декабря 2012 вторник