Hallo, ich nutze in einem meiner projekte die RtlCompressBuffer funktion um, wie der name bereits vermuten lässt, etwas zu komprimieren.
Nun bin ich über die
WMI CompressFile funktion gestolpert die bei NTFS dateisystem per windows daten schrumpfen lässt.
function CompressFile(const FileName:string):integer;var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObject : OLEVariant;begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', ''); FWbemObject := FWMIService.Get(Format('CIM_DataFile.Name="%s"',[StringReplace(FileName,'\','\\',[rfReplaceAll])])); Result:=FWbemObject.Compress();
aber diese funktion gilt ja nur für NTFS und eine datei als ganzes.
Jetzt frag ich mich, weil ja RtlCompressBuffer eine undokumentierte und möglicherweise nicht in jeder windows version zur verfügung stehende funktion ist, ob es eine legitime funktion gibt, die wie RtlCompressBuffer arbeitet (im speicher)
mit der man "On-The-Fly" etwas komprimieren kann damit ich ein "legitimes" produkt habe.
hier meine deklarationen mit "RtlCompressBuffer" damit ihr nachvollziehen wie ich es aufrufe:
Delphi-Quellcode:
function RtlGetCompressionWorkSpaceSize(CompressionFormatAndEngine: ULONG; CompressBufferWorkSpaceSize, CompressFragmentWorkSpaceSize : PULONG): NTSTATUS; stdcall;
function RtlCompressBuffer(CompressionFormatAndEngine:ULONG; SourceBuffer: PVOID; SourceBufferLength: ULONG; DestinationBuffer: PVOID; DestinationBufferLength: ULONG; SourceChunkSize: ULONG; pDestinationSize: PULONG; WorkspaceBuffer: PVOID):NTSTATUS; stdcall;
function RtlDeCompressBuffer(CompressionFormatAndEngine:ULONG; DestinationBuffer: PVOID; DestinationBufferLength: ULONG; SourceBuffer: PVOID; SourceBufferLength: ULONG; pDestinationSize: PULONG):NTSTATUS; stdcall;
implementation
const ntdll = 'ntdll.dll';
function RtlGetCompressionWorkSpaceSize; external ntdll name 'RtlGetCompressionWorkSpaceSize';
function RtlCompressBuffer; external ntdll name 'RtlCompressBuffer';
function RtlDeCompressBuffer; external ntdll name 'RtlDecompressBuffer';
im wesentlichen ging es mir darum eine leichte kompression zu erzielen die keinerlei Third-Party software einsetzt.
alles sollte mit windows bordmitteln per
WinAPI schaffbar sein...
kompression muss weder stark noch "knackfest" sein, sie soll lediglich einen ersten blick in eine datei abfälschen.
es geht hier um geschwindigkeit und woran ich halt jetzt grad grübel, kompatibilität zu windows.
im
DP hab ich bis jetzt noch nicht viel brauchbare infos dazu gefunden aber der eine oder andere hat mit sicherheit einen guten rat für mich parat, oder?
Besten Dank für's lesen und hoffentlich auch beantworten hehe
ps: nutzt nicht meine dargestellten funktionen in eurem code, sie sind bestimmt böse weshalb ich dieses Thema schrieb.