Поддержка компрессии в NT
От: Lonely Dog Россия  
Дата: 26.07.02 12:47
Оценка: 12 (1)
Привет всем. Вчера разобрался с поддержкой компрессии в 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. При его изменении не меняется не скорость компрессии, не степень сжатия. Может кто знает, что это такое?
Re[2]: Поддержка компрессии в NT
От: Lonely Dog Россия  
Дата: 08.10.02 10:42
Оценка: 3 (1)
Если ты разобрался с этой функцией, то может подскажежешь, что такое 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. (Из этого можно сделать простейший архиватор, если усекать файл до сжатого размера)

#include <windows.h>
#include <stdio.h>


#define NTSYSAPI extern "C"

#define COMPRESSION_FORMAT_NONE (0x0000) // winnt
#define COMPRESSION_FORMAT_DEFAULT (0x0001) // winnt
#define COMPRESSION_FORMAT_LZNT1 (0x0002) // winnt

#define COMPRESSION_ENGINE_STANDART (0x0000) // winnt
#define COMPRESSION_ENGINE_MAXIMUM (0x0100) // winnt
#define COMPRESSION_ENGINE_HIBER (0x0200) // winnt


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;

HANDLE hFile1 = CreateFile(argv[1], GENERIC_READ,
FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
HANDLE hFile2 = CreateFile(argv[2], GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);

ULONG n = GetFileSize(hFile1, 0);

HANDLE hMapping1 = CreateFileMapping(hFile1, 0, PAGE_READONLY, 0, 0, 0);
HANDLE hMapping2 = CreateFileMapping(hFile2, 0, PAGE_READWRITE, 0, n, 0);

PUCHAR p = PUCHAR(MapViewOfFileEx(hMapping1, FILE_MAP_READ, 0, 0, 0, 0));
PUCHAR q = PUCHAR(MapViewOfFileEx(hMapping2, FILE_MAP_WRITE, 0, 0, 0, 0));

ULONG ulBufferWsSize, ulFragmentWsSize;
ULONG st;
ULONG ulFormat = COMPRESSION_FORMAT_LZNT1 | COMPRESSION_ENGINE_STANDART;
st = RtlGetCompressionWorkSpaceSize(ulFormat, &ulBufferWsSize, &ulFragmentWsSize);

DWORD dwSize = 0;

PVOID pv = GlobalAlloc(GPTR, ulBufferWsSize);

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 намного быстрее.
Re: Поддержка компрессии в NT
От: Lonely Dog Россия  
Дата: 05.10.02 15:01
Оценка:
Здравствуйте 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)
Re[2]: Поддержка компрессии в NT
От: Alex Fedotov США  
Дата: 05.10.02 15:11
Оценка:
Здравствуйте Lonely Dog, Вы писали:

LD>Тогда еще по теме: на каком уровне IRQL могут быть вызваны эти функции в Kernel Mode? Менялся ли он при выпуске новых версий OS?


Исходя из общих знаний, раз эти функции работают только с буферами, которые даются им на вход, они могут вызываться при любом IRQL, если буферы заблокированы в физической памяти.
-- Alex Fedotov
Re[2]: Поддержка компрессии в NT
От: AndreyT  
Дата: 05.10.02 15:26
Оценка:
Здравствуйте Lonely Dog, Вы писали:

LD>Тогда еще по теме: на каком уровне IRQL могут быть вызваны эти функции в Kernel Mode? Менялся ли он при выпуске новых версий OS?


LD>PS: Я понимаю, что можно и самому исследовать этот вопрос, но у меня нет под рукой всех версий NT. (начиная с NT 3.5)


Если все буфера надодятся в non-paged pool, тогда можно их исполнять и на уровнях >= DISPATCH_LEVEL.
Но я что-то сомневаюсь, что это так.
Ну а если любая операция на таких уровнях генерирует page fault, то наверное и сам знаешь чем это кончается
Re: Поддержка компрессии в NT
От: chemi  
Дата: 08.10.02 10:16
Оценка:
Здравствуйте 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? и каким должен быть его размер

Кстати в ntifs.h определено

#define COMPRESSION_FORMAT_LZNT1 (0x0002)
#define COMPRESSION_ENGINE_MAXIMUM (0x0100)
#define COMPRESSION_ENGINE_HIBER (0x0200)

но у меня работает только COMPRESSION_FORMAT_LZNT1 (WinXP)
Re: Поддержка компрессии в NT
От: chemi  
Дата: 08.10.02 10:16
Оценка:
Здравствуйте 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? и каким должен быть его размер

Кстати в ntifs.h определено

#define COMPRESSION_FORMAT_LZNT1 (0x0002)
#define COMPRESSION_ENGINE_MAXIMUM (0x0100)
#define COMPRESSION_ENGINE_HIBER (0x0200)

но у меня работает только COMPRESSION_FORMAT_LZNT1 (WinXP)
Re: Поддержка компрессии в NT
От: __Nicolay Россия  
Дата: 08.10.02 11:24
Оценка:
Здравствуйте 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.
Возможно повлияет на скорость или расход памяти для больших блоков.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.