解读 DeltaDecompressFile
这是一个导出函数。
实际上只有四个参数:
第一个参数为基准文件,可以为空,这时就是自压缩文件,即DCN 格式;
第二个参数为标志,说明压缩文件的文件头长度,比如,DCD 格式为 12;
第三个参数为压缩文件;
第四个参数为输出文件,可以和第三个参数指定的文件相同,这样,就直接覆盖原来的压缩文件了。
//----- (1023E030) --------------------------------------------------------
int __userpurge Windows::Rtl::DeltaDecompressFile (
Windows::Rtl *this,
structWindows::Rtl::IRtlFile *a2,
unsigned __int32 a3,
structWindows::Rtl::IRtlFile *a4,
structWindows::Rtl::IRtlFile *a5)
{
v5 =`anonymous namespace'::ValidateDeltaBufferCompressorInitialized();
v16 =0;
v15 =0;
v17 =0;
v19 =0;
v18 =0;
v20 =0;
if (this
&&(v6 =*(int(__thiscall **)(Windows::Rtl *,_DWORD, unsigned __int32 *,_DWORD))(*(_DWORD *)this +24),
__guard_check_icall_fptr(*(_DWORD *)(*(_DWORD *)this +24)),
v5 =v6(this, 0,&v15, 0),
v5 <0)
||(v7 =*(int(__thiscall **)(unsigned __int32, _DWORD, unsigned__int32 *, _DWORD))(*(_DWORD *)a3 + 24),
__guard_check_icall_fptr(*(_DWORD *)(*(_DWORD *)a3 + 24)),
v5 =v7(a3, 0, &v18, 0),
v5 <0) )
{
LABEL_8:
Windows::Rtl::AutoBlob<Windows::Auto<_LBLOB>>::Close((int)&v18);
Windows::Rtl::AutoBlob<Windows::Auto<_LBLOB>>::Close((int)&v15);
return v5;
}
v13 =0;
v12 =0;
v14 =0;
v5 =Windows::Rtl::DeltaDecompressBuffer(
(Windows::Rtl*)3,
(unsigned__int32)&v15,
a2,
(unsigned__int32)&v18,
(struct_LBLOB *)&v12,
v11);
v8 =(Windows::Rtl::AutoDeltaBlob *)&v12;
if (v5 < 0
||(v9 =*(int(__thiscall **)(struct Windows::Rtl::IRtlFile *, _DWORD, int *))(*(_DWORD *)a4 + 28),
__guard_check_icall_fptr(*(_DWORD *)(*(_DWORD *)a4 + 28)),
v5 =v9(a4, 0, &v12),
v8 =(Windows::Rtl::AutoDeltaBlob *)&v12,
v5 <0) )
{
Windows::Rtl::AutoDeltaBlob::Close(v8);
goto LABEL_8;
}
Windows::Rtl::AutoDeltaBlob::Close((Windows::Rtl::AutoDeltaBlob *)&v12);
Windows::Rtl::AutoBlob<Windows::Auto<_LBLOB>>::Close((int)&v18);
Windows::Rtl::AutoBlob<Windows::Auto<_LBLOB>>::Close((int)&v15);
return 0;
}
DeltaDecompressFileFile
使用 DeltaDecompressFileFile函数可以解压缩 DCD 格式的压缩文件。
HRESULTDeltaDecompressFileFile( LPWSTRDeltaFileName, LPWSTRBaseFileName)
{
// 如果是增量压缩,那么第一个文件就是基准文件,第二个文件就是增量压缩文件,标志为 12
// 如果是自压缩,那么,第一个文件就为空,第二个文件为自压缩文件,标志为 4
InitFunPtrs_Wcp();
HRESULTresult = 0;
IRtlFile *pIFileDelta = NULL;
IRtlFile *pIFileBase = NULL;
GetInterfaceAndObject(DeltaFileName, &pIFileDelta, NULL, GENERIC_WRITE);
if (BaseFileName == NULL)
{
result = DeltaDecompressFile(NULL, DCHLENGTH::DCN, pIFileDelta, pIFileDelta);
}
else
{
GetInterfaceAndObject(BaseFileName, &pIFileBase, NULL, GENERIC_READ);
result = DeltaDecompressFile(pIFileBase, DCHLENGTH::DCD, pIFileDelta, pIFileDelta);
}
if (pIFileDelta)
{
pIFileDelta->Release();
}
if (pIFileBase)
{
pIFileBase->Release();
}
returnresult;
}
定义一个枚举,表示压缩文件头的长度:
enumDCHLENGTH
{
DCD = 12,
DCN = 4,
DCH = 12,
DCM = 4,
DCS = 12
};