通用是相对的,这里指的是xp和win7(其他版本我没测试过,不要用不要来找我)

#define CMP_FRM     COMPRESSION_FORMAT_LZNT1|COMPRESSION_ENGINE_MAXIMUM

typedef DWORD(__stdcall *RtlCompressBuffer_Fn)(
IN ULONG CompressionFormat,
IN PVOID SourceBuffer,
IN ULONG SourceBufferLength,
OUT PVOID DestinationBuffer,
IN ULONG DestinationBufferLength,
IN ULONG Unknown,
OUT PULONG pDestinationSize,
IN PVOID WorkspaceBuffer); typedef DWORD(__stdcall *RtlDecompressBuffer_Fn)(
IN ULONG CompressionFormat,
OUT PVOID DestinationBuffer,
IN ULONG DestinationBufferLength,
IN PVOID SourceBuffer,
IN ULONG SourceBufferLength,
OUT PULONG pDestinationSize); typedef DWORD(__stdcall *RtlGetCompressionWorkSpaceSize_Fn)(
IN ULONG CompressionFormat,
OUT PULONG pNeededBufferSize,
OUT PULONG pUnknown); LPBYTE CompressBuffer(LPBYTE lpIn, int iInLen, int & iOut); LPBYTE DecompressBuffer(LPBYTE lpIn, int iInlen, int & iOut);
static RtlCompressBuffer_Fn compress = NULL;
static RtlDecompressBuffer_Fn decompress = NULL;
static RtlGetCompressionWorkSpaceSize_Fn getcompressionworkspacesize = NULL;
void GetCompressApis()
{ if (compress && decompress && getcompressionworkspacesize)
{
return;
}
static WCHAR wszntdll[] = { L'n', L't', L'd', L'l', L'l', L'.', L'd', L'l', L'l', L'\0' };
static HMODULE hDll = LoadLibrary(wszntdll);
static char szRtlCompressBuffer[] = { 'R', 't', 'l', 'C', 'o', 'm', 'p', 'r', 'e', 's', 's', 'B', 'u', 'f', 'f', 'e', 'r', '\0' };
static char szRtlDecompressBuffer[] = { 'R', 't', 'l', 'D', 'e', 'c', 'o', 'm', 'p', 'r', 'e', 's', 's', 'B', 'u', 'f', 'f', 'e', 'r', '\0' };
static char szRtlGetCompressionWorkSpaceSize[] = { 'R', 't', 'l', 'G', 'e', 't', 'C', 'o', 'm', 'p', 'r', 'e', 's', 's', 'i', 'o', 'n', 'W', 'o', 'r', 'k', 'S', 'p', 'a', 'c', 'e', 'S', 'i', 'z', 'e', '\0' };
if (hDll)
{
compress = (RtlCompressBuffer_Fn)GetProcAddress(hDll, szRtlCompressBuffer);
decompress = (RtlDecompressBuffer_Fn)GetProcAddress(hDll, szRtlDecompressBuffer);
getcompressionworkspacesize = (RtlGetCompressionWorkSpaceSize_Fn)GetProcAddress(hDll, szRtlGetCompressionWorkSpaceSize); } }
//
// compress buffer
//
LPBYTE CompressBuffer(LPBYTE lpIn, int iInLen, int & iOut)
{
// 压缩格式 |原大小 2 | 压缩后大小 2| 数据 .....|hash 4|
GetCompressApis();
int dwOutBufferLen = iInLen*1.2 + ;
LPBYTE lpOut = (LPBYTE)zMalloc(dwOutBufferLen);
// 获取工作缓冲区大小
DWORD dwNeed, rc;
ULONG unKnow;
void* tempMeme;
rc = getcompressionworkspacesize(CMP_FRM, &dwNeed, &unKnow);
tempMeme = LocalAlloc(LPTR, dwNeed);
iOut = ;
rc = compress(CMP_FRM, lpIn, iInLen, lpOut + , dwOutBufferLen, unKnow, &dwNeed, tempMeme); LocalFree(tempMeme);
if (rc != )
{
zFree(lpOut);
return NULL;
}
*(short*)lpOut = iInLen;
iOut = dwNeed + ; return lpOut; }
//
// decompress buffer
//
LPBYTE DecompressBuffer(LPBYTE lpIn, int iInlen, int & iOut)
{
GetCompressApis();
short len = *(short*)lpIn;
if (len < || len > *)
{
return NULL ;
}
LPBYTE lpOut = (LPBYTE)zMalloc(len);
iOut = ;
DWORD dwRc = decompress(CMP_FRM, lpOut, len, lpIn + , iInlen - , (PULONG)&iOut);
if (dwRc != )
{
zFree(lpOut);
return NULL;
}
return lpOut; }

windows平台(不包括ARM的CE)通用的压缩和解压缩的更多相关文章

  1. 重新想象 Windows 8 Store Apps (70) - 其它: 文件压缩和解压缩, 与 Windows 商店相关的操作, app 与 web, 几个 Core 的应用, 页面的生命周期和程序的生命周期

    [源码下载] 重新想象 Windows 8 Store Apps (70) - 其它: 文件压缩和解压缩, 与 Windows 商店相关的操作, app 与 web, 几个 Core 的应用, 页面的 ...

  2. linux和windows之间的文件压缩和解压缩以及^R的问题

    推荐大家使用zip压缩和解压,因为zip一般是linux系统自带: 一.zip和unzip 1. zip压缩 zip -r myfile.zip ./web 将当前目录里的web下的所有文件和文件夹全 ...

  3. [帖子收集]通用Windows平台(UWP)

    通用Windows平台,universal windows platform,UWP 什么是通用 Windows 平台 (UWP) 应用?(微软MSDN) 如何在通用 Windows 平台应用中使用现 ...

  4. Windows平台交叉编译Arm Linux平台的QT5.7库

    1.准备交叉编译环境 环境说明:Windows 7 64位 此过程需要: (1)Qt库开源代码,我使用的是5.7.0版本: (2)Perl语言环境5.12版本以上: (3)Python语言环境 2.7 ...

  5. 详解 UWP (通用 Windows 平台) 中的两种 HttpClient API

    UWP (通用 Windows 平台) 应用开发者在构建通过 HTTP 与 Web 服务或服务器断点交互的应用时,有多种 API 可以选择.要在一个托管 UWP 应用中实现 HTTP 客户端角色,最常 ...

  6. 不同WINDOWS平台下磁盘逻辑扇区的直接读写

    不同WINDOWS平台下磁盘逻辑扇区的直接读写 关键字:VWIN32.中断.DeviceIoControl 一.概述 在DOS操作系统下,通过BIOS的INT13.DOS的INT25(绝对读).INT ...

  7. Windows平台部署Asp.Net Core应用

    一. 简介 Asp.Net Core 部署方式有两种:依赖框架和独立部署. 1. 框架依赖的部署: 顾名思义,依赖框架的部署 (FDD) 依赖目标系统上存在共享系统级版本的 .NET Core. 由于 ...

  8. Windows平台分布式架构实践 - 负载均衡(下)

    概述 我们在上一篇Windows平台分布式架构实践 - 负载均衡中讨论了Windows平台下通过NLB(Network Load Balancer) 来实现网站的负载均衡,并且通过压力测试演示了它的效 ...

  9. Windows平台下利用APM来做负载均衡方案 - 负载均衡(下)

    概述 我们在上一篇Windows平台分布式架构实践 - 负载均衡中讨论了Windows平台下通过NLB(Network Load Balancer) 来实现网站的负载均衡,并且通过压力测试演示了它的效 ...

随机推荐

  1. Hibernate中一对一关联映射/组件映射

    Hibernate映射:一对一关联 1.按照外键映射 2.按照主键映射 组件映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映射方式分别 ...

  2. hao123列表的实现

    <!DOCTYPE html><html><head>        <meta http-equiv="Content-Type" co ...

  3. ACM Steps 2.1.7

    Leftmost Digit   Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)  T ...

  4. bzoj4514: [Sdoi2016]数字配对--费用流

    看了一眼题目&数据范围,觉得应该是带下界的费用流 原来想拆点变成二分图,能配对的连边,跑二分图,可行性未知 后来看到另外一种解法.. 符合匹配要求的数要满足:质因子的个数相差为1,且两者可整除 ...

  5. spring中schedule注解的使用

    我们使用spring的注解 @Scheduled 执行定时任务 创建spring-task.xml 文件 <!---加入:xmlns:task="http://www.springfr ...

  6. # 20145334 《Java程序设计》第9周学习总结

    20145334 <Java程序设计>第9周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC 1.Java语言访问数据库的一种规范,是一套API. 2.JDBC (Java Da ...

  7. laravel 4.2 session

    laravel的session简要API Session的API还是比较简单的,大家看看中文文档也大概知道是怎么个意思.但是有那么几个还不太好理解. //session的永久保存(在不过期范围内) S ...

  8. windows7系统下一些常用工具的总结

    1.查看计算机的基本信息:计算机--右键--属性(快捷键:Win+Pause) 2.查看计算机的详细信息:开始菜单--所有程序--附件--系统工具--系统信息(运行命令:msinfo32) 3.定制计 ...

  9. js滚动加载插件

    function $xhyload(o){ var that=this; if(!o){ return; }else{ that.win=$(o.config.obj); that.qpanel=$( ...

  10. JS中的混合模式

    function Animation(list) { this.box = document.getElementById(list.id); this.size = list.size; this. ...