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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.026 c
15-1185869482
mutobor
2007-07-31 12:11
2007.08.26
проблемы при работе с БД


15-1185199585
Алхимик
2007-07-23 18:06
2007.08.26
Идентификация композиции


8-1163478013
Tab
2006-11-14 07:20
2007.08.26
квадрат с вращением в OpenGL


15-1185502791
SlymRO
2007-07-27 06:19
2007.08.26
С Днём Системного Администратора!!!


15-1185882018
Rimd
2007-07-31 15:40
2007.08.26
InterBase