![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
RtlDecompressBuffer - использование в цикле.
Riply © (2007-08-03 04:02:00)Здавствуйте !
Споткнулась на компрессии в NTFS.
Помогите, пожалуйста, разобраться.
Пробую делать так:
pWorkBuf := AllocMem(cbBufferWsSize);
// cbBufferWsSize получен при помощи RtlGetCompressionWorkSpaceSize = MAXWORD div 2
if pWorkBuf nil then
try
Offset := 0;
cbDistSize := 0;
TmpSize := cbSourSize;
while TmpSize > 0 do
begin
RetStatus := RtlDecompressBuffer(COMPRESSION_FORMAT_LZNT1, pWorkBuf, cbBufferWsSize,
PUCHAR(IncPtr(pSour, cbDistSize)), cbSourSize - cbDistSize, @Offset);
if RetStatus STATUS_SUCCESS then Break;
Move(pWorkBuf^, IncPtr(pDist, cbDistSize)^, Offset);
inc(cbDistSize, Offset);
dec(TmpSize, Offset);
end;
Result := RtlNtStatusToDosError(RetStatus);
Проблемма в следующем:
С маленькими объемами все работает как надо.
При больших, на третьем шаге вылетаем с ошибкой STATUS_BAD_COMPRESSION_BUFFER
(думаю, что она. RtlNtStatusToDosError ее перевести не может. Нашла по числовому значению у Игоря Шевченко).
Не могу понять в чем дело.
Нормального описания RtlDecompressBuffer найти не удалось. Есть только прототип, взятый у Неббета.
NTSTATUS NTAPI RtlDecompressBuffer(USHORT CompressionFormat, PVOID OutputBuffer, ULONG OutputBufferLength,
PVOID InputBuffer, ULONG InputBufferLength, PULONG ReturnLength);
Примерно его вариант и использую:
for (ULONG m, i = 0; i < n; i += m)
RtlDecompressBuffer(COMPRESSION_FORMAT_LZNT1, q + i, n - i, p + i, n - i, &m);
Это вся информация, которая есть. (Остальное, что удалось найти в интернете - копия Неббета один в один :)
Но и здесь мне все не понятно. :(
Почему Out и In - буффера (да и их размеры) инкрементируются на одинаковую величину ?
Как-то не логично. Казалось бы у каждого из них должно быть свое смещение.
Игорь Шевченко (2007-08-03 16:09:00) [1]
> Данные мне нужны для копирования файла.
{Copy|Move}File вызвать религия не позволяет ?
Да и потом, а какая тебе разница, в каком там формате данные - в сжатом или в несжатом - ты же кластеры копируешь.
Andrey_rus (2007-08-03 15:16:00) [2]
> > [4] Игорь Шевченко © (03.08.07 13:15)>Но спешу тебя
> обрадовать - кроме сжатия, есть еще EFSУжас. А это еще что
> за зверь ?
Шифрование.
Riply (2007-08-03 13:47:00) [3]P.S.
>[4] Игорь Шевченко © (03.08.07 13:15)
>В сжатом виде находятся сами данные. Ты с ними собираешься работать ?
Данные мне нужны для копирования файла.
Riply (2007-08-03 13:25:00) [4]> [4] Игорь Шевченко © (03.08.07 13:15)
>Но спешу тебя обрадовать - кроме сжатия, есть еще EFS
Ужас. А это еще что за зверь ?
Игорь Шевченко (2007-08-03 13:15:00) [5]
> Если я правильно поняла, в BASE_ATTRIBUTE есть флаг, указывающий
> на то,
> находяться ли данные в комрессированном виде.
> Соответственно, если мы получаем из UNRESIDENT_ATTRIBUTE
> RunArray - цепочку кластеров и флаг установлен, то для работы
> с ними, их надо декомпрессировать.
> Или я что-то путаю ?
В сжатом виде находятся сами данные. Ты с ними собираешься работать ? Тогда да, надо. А если с самим содержимым атрибута не собираешься работать, то не надо.
Но спешу тебя обрадовать - кроме сжатия, есть еще EFS
Riply (2007-08-03 12:57:00) [6]>[1] Lacmus © (03.08.07 11:33)
>Может быть поможет
> http://www.freebasic.net/forum/viewtopic.php?t=4651
Спасибо.
>[2] Игорь Шевченко © (03.08.07 12:05)
>Компрессия - она к потокам относится.
>Зачем тебе она при работе с MFT - это вопрос.
Если я правильно поняла, в BASE_ATTRIBUTE есть флаг, указывающий на то,
находяться ли данные в комрессированном виде.
Соответственно, если мы получаем из UNRESIDENT_ATTRIBUTE
RunArray - цепочку кластеров и флаг установлен, то для работы с ними, их надо декомпрессировать.
Или я что-то путаю ?
>Но в любом случае, смотри исходники линуксового драйвера NTFS - если он не умеет,
>то смотри работу с NTFS в reactos ( http://www.reactos.org)
По исходникам от линукса я пробежалась поиском на вхождение RtlDecompressBuffer,
но (что и следовало ожидать :) ничего не нашла. Более детально, пока, их не изучала.
Просто Неббет предложил решение в одну строчку, вот я и обрадовалась.
Я же лентяйка и лишнюю работу делать не хочу :)
Ну раз "с нахрапа" город взять не удалось, то переходим к планомерной осаде :)
Игорь Шевченко (2007-08-03 12:05:00) [7]
> Споткнулась на компрессии в NTFS.
Компрессия - она к потокам относится. Зачем тебе она при работе с MFT - это вопрос.
Но в любом случае, смотри исходники линуксового драйвера NTFS - если он не умеет, то смотри работу с NTFS в reactos ( http://www.reactos.org)
Lacmus (2007-08-03 11:33:00) [8]Может быть поможет
http://www.freebasic.net/forum/viewtopic.php?t=4651