Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
Время: 0.081 c
15-1185649384
Poed
2007-07-28 23:03
2007.08.26
Помогите выбрать IDE для проведения олимпиад.


2-1185777100
johntemp
2007-07-30 10:31
2007.08.26
TExcelApplication в Delphi 3?


15-1185260598
boriskb
2007-07-24 11:03
2007.08.26
"Кысь"


15-1185460867
БарЛог
2007-07-26 18:41
2007.08.26
Книга по строению автомобиля "для чайников"


15-1185295412
Sergey Masloff
2007-07-24 20:43
2007.08.26
Nokia 6510 самый лучший телефон ;-)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский