Форум: "Начинающим";
Текущий архив: 2007.08.26;
Скачать: [xml.tar.bz2];
ВнизRtlDecompressBuffer - использование в цикле. Найти похожие ветки
← →
Riply © (2007-08-03 04:02) [0]Здавствуйте !
Споткнулась на компрессии в 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 - буффера (да и их размеры) инкрементируются на одинаковую величину ?
Как-то не логично. Казалось бы у каждого из них должно быть свое смещение.
← →
Lacmus © (2007-08-03 11:33) [1]Может быть поможет
http://www.freebasic.net/forum/viewtopic.php?t=4651
← →
Игорь Шевченко © (2007-08-03 12:05) [2]
> Споткнулась на компрессии в NTFS.
Компрессия - она к потокам относится. Зачем тебе она при работе с MFT - это вопрос.
Но в любом случае, смотри исходники линуксового драйвера NTFS - если он не умеет, то смотри работу с NTFS в reactos (http://www.reactos.org)
← →
Riply © (2007-08-03 12:57) [3]>[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 13:15) [4]
> Если я правильно поняла, в BASE_ATTRIBUTE есть флаг, указывающий
> на то,
> находяться ли данные в комрессированном виде.
> Соответственно, если мы получаем из UNRESIDENT_ATTRIBUTE
> RunArray - цепочку кластеров и флаг установлен, то для работы
> с ними, их надо декомпрессировать.
> Или я что-то путаю ?
В сжатом виде находятся сами данные. Ты с ними собираешься работать ? Тогда да, надо. А если с самим содержимым атрибута не собираешься работать, то не надо.
Но спешу тебя обрадовать - кроме сжатия, есть еще EFS
← →
Riply © (2007-08-03 13:25) [5]> [4] Игорь Шевченко © (03.08.07 13:15)
>Но спешу тебя обрадовать - кроме сжатия, есть еще EFS
Ужас. А это еще что за зверь ?
← →
Riply © (2007-08-03 13:47) [6]P.S.
>[4] Игорь Шевченко © (03.08.07 13:15)
>В сжатом виде находятся сами данные. Ты с ними собираешься работать ?
Данные мне нужны для копирования файла.
← →
Andrey_rus © (2007-08-03 15:16) [7]
> > [4] Игорь Шевченко © (03.08.07 13:15)>Но спешу тебя
> обрадовать - кроме сжатия, есть еще EFSУжас. А это еще что
> за зверь ?
Шифрование.
← →
Игорь Шевченко © (2007-08-03 16:09) [8]
> Данные мне нужны для копирования файла.
{Copy|Move}File вызвать религия не позволяет ?
Да и потом, а какая тебе разница, в каком там формате данные - в сжатом или в несжатом - ты же кластеры копируешь.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.08.26;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 6.028 c