windows平台(不包括ARM的CE)通用的压缩和解压缩
通用是相对的,这里指的是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)通用的压缩和解压缩的更多相关文章
- 重新想象 Windows 8 Store Apps (70) - 其它: 文件压缩和解压缩, 与 Windows 商店相关的操作, app 与 web, 几个 Core 的应用, 页面的生命周期和程序的生命周期
[源码下载] 重新想象 Windows 8 Store Apps (70) - 其它: 文件压缩和解压缩, 与 Windows 商店相关的操作, app 与 web, 几个 Core 的应用, 页面的 ...
- linux和windows之间的文件压缩和解压缩以及^R的问题
推荐大家使用zip压缩和解压,因为zip一般是linux系统自带: 一.zip和unzip 1. zip压缩 zip -r myfile.zip ./web 将当前目录里的web下的所有文件和文件夹全 ...
- [帖子收集]通用Windows平台(UWP)
通用Windows平台,universal windows platform,UWP 什么是通用 Windows 平台 (UWP) 应用?(微软MSDN) 如何在通用 Windows 平台应用中使用现 ...
- Windows平台交叉编译Arm Linux平台的QT5.7库
1.准备交叉编译环境 环境说明:Windows 7 64位 此过程需要: (1)Qt库开源代码,我使用的是5.7.0版本: (2)Perl语言环境5.12版本以上: (3)Python语言环境 2.7 ...
- 详解 UWP (通用 Windows 平台) 中的两种 HttpClient API
UWP (通用 Windows 平台) 应用开发者在构建通过 HTTP 与 Web 服务或服务器断点交互的应用时,有多种 API 可以选择.要在一个托管 UWP 应用中实现 HTTP 客户端角色,最常 ...
- 不同WINDOWS平台下磁盘逻辑扇区的直接读写
不同WINDOWS平台下磁盘逻辑扇区的直接读写 关键字:VWIN32.中断.DeviceIoControl 一.概述 在DOS操作系统下,通过BIOS的INT13.DOS的INT25(绝对读).INT ...
- Windows平台部署Asp.Net Core应用
一. 简介 Asp.Net Core 部署方式有两种:依赖框架和独立部署. 1. 框架依赖的部署: 顾名思义,依赖框架的部署 (FDD) 依赖目标系统上存在共享系统级版本的 .NET Core. 由于 ...
- Windows平台分布式架构实践 - 负载均衡(下)
概述 我们在上一篇Windows平台分布式架构实践 - 负载均衡中讨论了Windows平台下通过NLB(Network Load Balancer) 来实现网站的负载均衡,并且通过压力测试演示了它的效 ...
- Windows平台下利用APM来做负载均衡方案 - 负载均衡(下)
概述 我们在上一篇Windows平台分布式架构实践 - 负载均衡中讨论了Windows平台下通过NLB(Network Load Balancer) 来实现网站的负载均衡,并且通过压力测试演示了它的效 ...
随机推荐
- Hadoop.2.x_WordCount本地测试示例
代码如下, 后备参考: package com.bigdata.hadoop.hdfs; import java.io.IOException; import org.apache.hadoop.co ...
- HTML静态网页 格式与布局
一.position:fixed 锁定位置(相对于浏览器的位置),例如有些网站的右下角的弹出窗口. 示例: 二.position:absolute 相对于自己最近的父元素来定位的 1.外层没有pos ...
- linux笔记八---------文件查找
1.find文件查找指令 > find 目录 参数 参数值,参数 参数值..... > find / -name passwd //从系统根目录开始递归查找name=p ...
- UIDynamic(物理仿真)
简介 什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象 如: 重力.弹性碰撞等现象 物理引 ...
- 自动删除Mysql备份(数组+for)
#!/bin/bash #author:V #Dispaly:auto delete mysql backup. BACKDIR=(/home/11/mysqlbackup/ /home/full/) ...
- LaTex 数学公式
\usepackage{amsmath} 常用宏包 \usepackage{arydshln} 此宏包带虚线 $ $ 行内公式 $$ $$ 行间公式 \[ \] 行间公式 \numberwithin{ ...
- ios-滚动视图滚动取消键盘
_scroll.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;_SearchTable.keyboardDismissMode ...
- vim正则表达式(转)
Vim中的正则表达式功能很强大,如果能自由运用,则可以完成很多难以想象的操作. 如果你比较熟悉Perl的正规表达式,可以直接参照与Perl正则表达式的区别一节. 一.使用正则表达式的命令 使用正则表达 ...
- embedded tomcat context.xml
在网络下载相关的embedded tomcat jar.也可直接在maven中检索. 在main方法中,输入以下代码: //新建tomcat实例 Tomcat tomcat = new Tomcat( ...
- cookbook学习第一弹
1.1现在有一个包含N个元素的元组或者是序列,怎样将它里面的值解压后同时赋值给N个变量 代码: >>>p = (4,5) >>>x,y = p >>&g ...