Привет всем. Вчера разобрался с поддержкой компрессии в NT. если кто не знает: есть 2 функции: RtlCompressBuffer и RtlDecompressBuffer. Сидят они в ntdll.dll и в ntoskrnl.exe. С помощью них можно сжимать данные. (на их основе работает компрессия на NTFS) С RtlDecompressBuffer понятно как работать. C RtlCompressBuffer тоже. Но есть один момент:
RtlCompressBuffer имеет следующий прототип:
NTSYSAPI
ULONG
NTAPI
RtlCompressBuffer (
IN USHORT CompressionFormatAndEngine,
IN PUCHAR UncompressedBuffer,
IN ULONG UncompressedBufferSize,
OUT PUCHAR CompressedBuffer,
IN ULONG CompressedBufferSize,
IN ULONG UncompressedChunkSize,
OUT PULONG FinalCompressedSize,
IN PVOID WorkSpace
);
не совсем понятно, что такое UncompressedChunkSize. При его изменении не меняется не скорость компрессии, не степень сжатия. Может кто знает, что это такое?
Если ты разобрался с этой функцией, то может подскажежешь, что такое WorkSpace? и каким должен быть его размер
C>Кстати в ntifs.h определено
C>#define COMPRESSION_FORMAT_LZNT1 (0x0002) C>#define COMPRESSION_ENGINE_MAXIMUM (0x0100) C>#define COMPRESSION_ENGINE_HIBER (0x0200)
C>но у меня работает только COMPRESSION_FORMAT_LZNT1 (WinXP)
C>
Вот пример работы с RtlCompressBuffer. (Из этого можно сделать простейший архиватор, если усекать файл до сжатого размера)
NTSYSAPI
ULONG
NTAPI
RtlGetCompressionWorkSpaceSize (
IN USHORT CompressionFormatAndEngine,
OUT PULONG CompressBufferWorkSpaceSize,
OUT PULONG CompressFragmentWorkSpaceSize
);
NTSYSAPI
ULONG
NTAPI
RtlCompressBuffer (
IN USHORT CompressionFormatAndEngine,
IN PUCHAR UncompressedBuffer,
IN ULONG UncompressedBufferSize,
OUT PUCHAR CompressedBuffer,
IN ULONG CompressedBufferSize,
IN ULONG UncompressedChunkSize,
OUT PULONG FinalCompressedSize,
IN PVOID WorkSpace
);
int main(int argc, char *argv[])
{
if (argc != 3) return 0;
DWORD dwSize1;
st = RtlCompressBuffer(ulFormat,
p, n,
q, n,
n,
&dwSize,
pv);
printf("mem: %d\nSize = %d\n", ulBufferWsSize, dwSize);
getchar();
return 0;
}
PS: Эту фигню надо линковать с ntdll.lib из DDK.
PPS: COMPRESSION_FORMAT_LZNT1 — Алгоритм сжатия. (При проектировании NT, ребята из MS хотели добавить возможность расширения системы новыми алгоритмами сжатия, но сделали ли они это или нет, я не знаю.)
COMPRESSION_ENGINE_XXX — Степень сжатия. Реально Hiber от standart отличается процентоа на 10 по степени сжатия, но standart намного быстрее.
Здравствуйте Lonely Dog, Вы писали:
LD>Привет всем. Вчера разобрался с поддержкой компрессии в NT. если кто не знает: есть 2 функции: RtlCompressBuffer и RtlDecompressBuffer. Сидят они в ntdll.dll и в ntoskrnl.exe. С помощью них можно сжимать данные. (на их основе работает компрессия на NTFS) С RtlDecompressBuffer понятно как работать. C RtlCompressBuffer тоже. Но есть один момент:
LD>RtlCompressBuffer имеет следующий прототип: LD>NTSYSAPI LD>ULONG LD>NTAPI LD>RtlCompressBuffer ( LD> IN USHORT CompressionFormatAndEngine, LD> IN PUCHAR UncompressedBuffer, LD> IN ULONG UncompressedBufferSize, LD> OUT PUCHAR CompressedBuffer, LD> IN ULONG CompressedBufferSize, LD> IN ULONG UncompressedChunkSize, LD> OUT PULONG FinalCompressedSize, LD> IN PVOID WorkSpace LD> );
LD>не совсем понятно, что такое UncompressedChunkSize. При его изменении не меняется не скорость компрессии, не степень сжатия. Может кто знает, что это такое?
что-то на этот вопрос не кто не хочет отвечать...
Тогда еще по теме: на каком уровне IRQL могут быть вызваны эти функции в Kernel Mode? Менялся ли он при выпуске новых версий OS?
PS: Я понимаю, что можно и самому исследовать этот вопрос, но у меня нет под рукой всех версий NT. (начиная с NT 3.5)
Здравствуйте Lonely Dog, Вы писали:
LD>Тогда еще по теме: на каком уровне IRQL могут быть вызваны эти функции в Kernel Mode? Менялся ли он при выпуске новых версий OS?
Исходя из общих знаний, раз эти функции работают только с буферами, которые даются им на вход, они могут вызываться при любом IRQL, если буферы заблокированы в физической памяти.
Здравствуйте Lonely Dog, Вы писали:
LD>Тогда еще по теме: на каком уровне IRQL могут быть вызваны эти функции в Kernel Mode? Менялся ли он при выпуске новых версий OS?
LD>PS: Я понимаю, что можно и самому исследовать этот вопрос, но у меня нет под рукой всех версий NT. (начиная с NT 3.5)
Если все буфера надодятся в non-paged pool, тогда можно их исполнять и на уровнях >= DISPATCH_LEVEL.
Но я что-то сомневаюсь, что это так.
Ну а если любая операция на таких уровнях генерирует page fault, то наверное и сам знаешь чем это кончается
Здравствуйте Lonely Dog, Вы писали:
LD>Привет всем. Вчера разобрался с поддержкой компрессии в NT. если кто не знает: есть 2 функции: RtlCompressBuffer и RtlDecompressBuffer. Сидят они в ntdll.dll и в ntoskrnl.exe. С помощью них можно сжимать данные. (на их основе работает компрессия на NTFS) С RtlDecompressBuffer понятно как работать. C RtlCompressBuffer тоже. Но есть один момент:
LD>RtlCompressBuffer имеет следующий прототип: LD>NTSYSAPI LD>ULONG LD>NTAPI LD>RtlCompressBuffer ( LD> IN USHORT CompressionFormatAndEngine, LD> IN PUCHAR UncompressedBuffer, LD> IN ULONG UncompressedBufferSize, LD> OUT PUCHAR CompressedBuffer, LD> IN ULONG CompressedBufferSize, LD> IN ULONG UncompressedChunkSize, LD> OUT PULONG FinalCompressedSize, LD> IN PVOID WorkSpace LD> );
Если ты разобрался с этой функцией, то может подскажежешь, что такое WorkSpace? и каким должен быть его размер
Здравствуйте Lonely Dog, Вы писали:
LD>Привет всем. Вчера разобрался с поддержкой компрессии в NT. если кто не знает: есть 2 функции: RtlCompressBuffer и RtlDecompressBuffer. Сидят они в ntdll.dll и в ntoskrnl.exe. С помощью них можно сжимать данные. (на их основе работает компрессия на NTFS) С RtlDecompressBuffer понятно как работать. C RtlCompressBuffer тоже. Но есть один момент:
LD>RtlCompressBuffer имеет следующий прототип: LD>NTSYSAPI LD>ULONG LD>NTAPI LD>RtlCompressBuffer ( LD> IN USHORT CompressionFormatAndEngine, LD> IN PUCHAR UncompressedBuffer, LD> IN ULONG UncompressedBufferSize, LD> OUT PUCHAR CompressedBuffer, LD> IN ULONG CompressedBufferSize, LD> IN ULONG UncompressedChunkSize, LD> OUT PULONG FinalCompressedSize, LD> IN PVOID WorkSpace LD> );
Если ты разобрался с этой функцией, то может подскажежешь, что такое WorkSpace? и каким должен быть его размер
Здравствуйте Lonely Dog, Вы писали:
LD>Привет всем. Вчера разобрался с поддержкой компрессии в NT. если кто не знает: есть 2 функции: RtlCompressBuffer и RtlDecompressBuffer. Сидят они в ntdll.dll и в ntoskrnl.exe. С помощью них можно сжимать данные. (на их основе работает компрессия на NTFS) С RtlDecompressBuffer понятно как работать. C RtlCompressBuffer тоже. Но есть один момент:
LD>RtlCompressBuffer имеет следующий прототип: LD>NTSYSAPI LD>ULONG LD>NTAPI LD>RtlCompressBuffer ( LD> IN USHORT CompressionFormatAndEngine, LD> IN PUCHAR UncompressedBuffer, LD> IN ULONG UncompressedBufferSize, LD> OUT PUCHAR CompressedBuffer, LD> IN ULONG CompressedBufferSize, LD> IN ULONG UncompressedChunkSize, LD> OUT PULONG FinalCompressedSize, LD> IN PVOID WorkSpace LD> );
LD>не совсем понятно, что такое UncompressedChunkSize. При его изменении не меняется не скорость компрессии, не степень сжатия. Может кто знает, что это такое?
Chunk — кусок, значит по идее компрессия происходит "кусками" максимальный размер такого блока наверно и есть UncompressedChunkSize.
Возможно повлияет на скорость или расход памяти для больших блоков.