当前位置: 首页 > news >正文

加强公司内部网站建设免费软文发布平台

加强公司内部网站建设,免费软文发布平台,南阳网站建设制作价格,苏州网站推广在Windows编程中,经常会遇到需要对数据进行压缩和解压缩的情况,数据压缩是一种常见的优化手段,能够减小数据的存储空间并提高传输效率。Windows提供了这些API函数,本文将深入探讨使用Windows API进行数据压缩与解压缩的过程&#…

在Windows编程中,经常会遇到需要对数据进行压缩和解压缩的情况,数据压缩是一种常见的优化手段,能够减小数据的存储空间并提高传输效率。Windows提供了这些API函数,本文将深入探讨使用Windows API进行数据压缩与解压缩的过程,主要使用ntdll.dll库中的相关函数。

RtlGetCompressionWorkSpaceSize

RtlGetCompressionWorkSpaceSize 函数,位于ntdll.dll库中。该函数用于获取数据压缩所需的工作空间大小。CompressionFormatAndEngine参数指定压缩格式和引擎,CompressBufferWorkSpaceSizeCompressFragmentWorkSpaceSize分别用于输出缓冲区和片段的工作空间大小。

以下是该函数的声明:

typedef NTSTATUS(WINAPI *typedef_RtlGetCompressionWorkSpaceSize)(_In_  USHORT CompressionFormatAndEngine,_Out_ PULONG CompressBufferWorkSpaceSize,_Out_ PULONG CompressFragmentWorkSpaceSize
);

该函数有以下参数:

  • CompressionFormatAndEngine:指定压缩格式和引擎的参数。
  • CompressBufferWorkSpaceSize:用于输出压缩缓冲区工作空间大小的指针。
  • CompressFragmentWorkSpaceSize:用于输出压缩片段工作空间大小的指针。

函数返回NTSTATUS类型的状态码,其中STATUS_SUCCESS表示成功执行。

在使用这个函数时,你需要提供足够大的缓冲区来存储工作空间大小。可以按照以下步骤使用该函数:

  • 加载 ntdll.dll 库。
  • 获取 RtlGetCompressionWorkSpaceSize 函数地址。
  • 定义变量用于存储工作空间大小。
  • 调用 RtlGetCompressionWorkSpaceSize 函数,获取工作空间大小。
RtlCompressBuffer

RtlCompressBuffer 同样位于ntdll.dll库中。该函数用于将数据进行压缩。CompressionFormatAndEngine参数指定压缩格式和引擎,UncompressedBufferUncompressedBufferSize表示输入的未压缩数据,CompressedBufferCompressedBufferSize表示输出的压缩数据,UncompressedChunkSize表示未压缩数据的块大小,FinalCompressedSize表示最终压缩后的大小,WorkSpace表示用于工作的缓冲区。

以下是该函数的声明:

typedef NTSTATUS(WINAPI *typedef_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
);

该函数的参数包括:

  • CompressionFormatAndEngine:指定压缩格式和引擎的参数。
  • UncompressedBuffer:指向待压缩数据的指针。
  • UncompressedBufferSize:待压缩数据的大小。
  • CompressedBuffer:指向存储压缩数据的缓冲区的指针。
  • CompressedBufferSize:存储压缩数据的缓冲区的大小。
  • UncompressedChunkSize:未压缩的数据块的大小。
  • FinalCompressedSize:用于输出最终压缩数据的大小的指针。
  • WorkSpace:用于提供工作空间的指针。

函数返回NTSTATUS类型的状态码,其中STATUS_SUCCESS表示成功执行。

在使用这个函数时,你需要提供足够大的缓冲区来存储压缩后的数据。可以按照以下步骤使用该函数:

  • 加载ntdll.dll库。
  • 获取RtlCompressBuffer函数地址。
  • 定义变量并分配内存用于存储未压缩的数据和压缩后的数据。
  • 定义变量用于存储工作空间。
  • 调用RtlCompressBuffer函数,将数据进行压缩。
  • 处理压缩后的数据。
RtlDecompressBuffer

RtlDecompressBuffer 同样位于ntdll.dll库中。该函数用于将压缩数据进行解压缩。CompressionFormat参数指定压缩格式,UncompressedBufferUncompressedBufferSize表示输出的未压缩数据,CompressedBufferCompressedBufferSize表示输入的压缩数据,FinalUncompressedSize表示最终解压缩后的大小。

以下是该函数的声明:

typedef NTSTATUS(WINAPI *typedef_RtlDecompressBuffer)(_In_  USHORT CompressionFormat,_Out_ PUCHAR UncompressedBuffer,_In_  ULONG  UncompressedBufferSize,_In_  PUCHAR CompressedBuffer,_In_  ULONG  CompressedBufferSize,_Out_ PULONG FinalUncompressedSize
);

该函数的参数包括:

  • CompressionFormat:指定解压缩的格式。
  • UncompressedBuffer:指向存储解压后数据的缓冲区的指针。
  • UncompressedBufferSize:存储解压后数据的缓冲区的大小。
  • CompressedBuffer:指向待解压数据的指针。
  • CompressedBufferSize:待解压数据的大小。
  • FinalUncompressedSize:用于输出最终解压后数据的大小的指针。

函数返回NTSTATUS类型的状态码,其中STATUS_SUCCESS表示成功执行。

在使用这个函数时,你需要提供足够大的缓冲区来存储解压后的数据。可以按照以下步骤使用该函数:

  • 加载ntdll.dll库。
  • 获取RtlDecompressBuffer函数地址。
  • 定义变量并分配内存用于存储待解压的数据和解压后的数据。
  • 调用RtlDecompressBuffer函数,将数据进行解压。
  • 处理解压后的数据。
// 代码来源 《WINDOWS黑客编程技术详解》
// 作者:甘迪文
#include <Windows.h>
#include <iostream>
#include <windef.h>typedef NTSTATUS(WINAPI *typedef_RtlGetCompressionWorkSpaceSize)(_In_  USHORT CompressionFormatAndEngine,_Out_ PULONG CompressBufferWorkSpaceSize,_Out_ PULONG CompressFragmentWorkSpaceSize);typedef NTSTATUS(WINAPI *typedef_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);typedef NTSTATUS(WINAPI *typedef_RtlDecompressBuffer)(_In_  USHORT CompressionFormat,_Out_ PUCHAR UncompressedBuffer,_In_  ULONG  UncompressedBufferSize,_In_  PUCHAR CompressedBuffer,_In_  ULONG  CompressedBufferSize,_Out_ PULONG FinalUncompressedSize);// 数据压缩
BOOL CompressData(BYTE *pUncompressData, DWORD dwUncompressDataLength, BYTE **ppCompressData, DWORD *pdwCompressDataLength)
{BOOL bRet = FALSE;NTSTATUS status = 0;HMODULE hModule = NULL;typedef_RtlGetCompressionWorkSpaceSize RtlGetCompressionWorkSpaceSize = NULL;typedef_RtlCompressBuffer RtlCompressBuffer = NULL;DWORD dwWorkSpaceSize = 0, dwFragmentWorkSpaceSize = 0;BYTE *pWorkSpace = NULL;BYTE *pCompressData = NULL;DWORD dwCompressDataLength = 4096;DWORD dwFinalCompressSize = 0;do{// 加载 ntdll.dll hModule = ::LoadLibrary("ntdll.dll");if (NULL == hModule){ShowError("LoadLibrary");break;}// 获取 RtlGetCompressionWorkSpaceSize 函数地址RtlGetCompressionWorkSpaceSize = (typedef_RtlGetCompressionWorkSpaceSize)::GetProcAddress(hModule, "RtlGetCompressionWorkSpaceSize");if (NULL == RtlGetCompressionWorkSpaceSize){ShowError("GetProcAddress");break;}// 获取 RtlCompressBuffer 函数地址RtlCompressBuffer = (typedef_RtlCompressBuffer)::GetProcAddress(hModule, "RtlCompressBuffer");if (NULL == RtlCompressBuffer){ShowError("GetProcAddress");break;}// 获取WorkSpqce大小status = RtlGetCompressionWorkSpaceSize(COMPRESSION_FORMAT_LZNT1 | COMPRESSION_ENGINE_STANDARD, &dwWorkSpaceSize, &dwFragmentWorkSpaceSize);if (0 != status){break;}// 申请动态内存pWorkSpace = new BYTE[dwWorkSpaceSize];if (NULL == pWorkSpace){break;}::RtlZeroMemory(pWorkSpace, dwWorkSpaceSize);while (TRUE){// 申请动态内存pCompressData = new BYTE[dwCompressDataLength];if (NULL == pCompressData){break;}::RtlZeroMemory(pCompressData, dwCompressDataLength);// 调用RtlCompressBuffer压缩数据RtlCompressBuffer(COMPRESSION_FORMAT_LZNT1, pUncompressData, dwUncompressDataLength, pCompressData, dwCompressDataLength, 4096, &dwFinalCompressSize, (PVOID)pWorkSpace);if (dwCompressDataLength < dwFinalCompressSize){// 释放内存if (pCompressData){delete[]pCompressData;pCompressData = NULL;}dwCompressDataLength = dwFinalCompressSize;}else{break;}}// 返回*ppCompressData = pCompressData;*pdwCompressDataLength = dwFinalCompressSize;bRet = TRUE;} while (FALSE);// 释放if (pWorkSpace){delete[]pWorkSpace;pWorkSpace = NULL;}if (hModule){::FreeLibrary(hModule);}return bRet;
}// 数据解压缩
BOOL UncompressData(BYTE *pCompressData, DWORD dwCompressDataLength, BYTE **ppUncompressData, DWORD *pdwUncompressDataLength)
{BOOL bRet = FALSE;HMODULE hModule = NULL;typedef_RtlDecompressBuffer RtlDecompressBuffer = NULL;BYTE *pUncompressData = NULL;DWORD dwUncompressDataLength = 4096;DWORD dwFinalUncompressSize = 0;do{// 加载 ntdll.dll hModule = ::LoadLibrary("ntdll.dll");if (NULL == hModule){break;}// 获取 RtlDecompressBuffer 函数地址RtlDecompressBuffer = (typedef_RtlDecompressBuffer)::GetProcAddress(hModule, "RtlDecompressBuffer");if (NULL == RtlDecompressBuffer){break;}while (TRUE){// 申请动态内存pUncompressData = new BYTE[dwUncompressDataLength];if (NULL == pUncompressData){break;}::RtlZeroMemory(pUncompressData, dwUncompressDataLength);// 调用RtlCompressBuffer压缩数据RtlDecompressBuffer(COMPRESSION_FORMAT_LZNT1, pUncompressData, dwUncompressDataLength, pCompressData, dwCompressDataLength, &dwFinalUncompressSize);if (dwUncompressDataLength < dwFinalUncompressSize){// 释放内存if (pUncompressData){delete[]pUncompressData;pUncompressData = NULL;}dwUncompressDataLength = dwFinalUncompressSize;}else{break;}}// 返回*ppUncompressData = pUncompressData;*pdwUncompressDataLength = dwFinalUncompressSize;bRet = TRUE;} while (FALSE);// 释放if (hModule){::FreeLibrary(hModule);}return bRet;
}int main(int argc, char *argv[])
{DWORD i = 0;BOOL bRet = FALSE;char szBuffer[] = "DDDDDDDDDDGGGGGGGGGGGG";DWORD dwBufferLength = ::lstrlen(szBuffer);BYTE *pCompressData = NULL;DWORD dwCompressDataLength = 0;BYTE *pUncompressData = NULL;DWORD dwUncompressDataLength = 0;// 压缩数据CompressData((BYTE *)szBuffer, dwBufferLength, &pCompressData, &dwCompressDataLength);// 解压数据UncompressData(pCompressData, dwCompressDataLength, &pUncompressData, &dwUncompressDataLength);// 显示printf("原数据为:\n");for (i = 0; i < dwBufferLength; i++){printf("%X ", szBuffer[i]);}printf("\n\n压缩数据为:\n");for (i = 0; i < dwCompressDataLength; i++){printf("%X ", pCompressData[i]);}printf("\n\n解压缩数据为:\n");for (i = 0; i < dwUncompressDataLength; i++){printf("%X ", pUncompressData[i]);}printf("\n");// 释放if (pUncompressData){delete[]pUncompressData;pUncompressData = NULL;}if (pCompressData){delete[]pCompressData;pCompressData = NULL;}system("pause");return 0;
}
http://www.yidumall.com/news/79348.html

相关文章:

  • 贵阳网站建设 赶集成人技术培训班有哪些种类
  • 南山网站建设哪家效益快如何建立网页
  • 专门做网站公司西安seo关键字优化
  • 企业网站打包下载百度新闻官网
  • 简单网站的设计与制作seo赚钱方式
  • 新手做网站流程网址seo关键词
  • 2014网站建设网上销售方法
  • 网站建设推荐公司线上营销推广方案模板
  • 网站建设 功能需求自己做网站如何赚钱
  • 如何做网站滚动屏幕媒体营销平台
  • 员工入职 在哪个网站做招工什么软件可以弄排名
  • 新手怎么做美工图山东seo首页关键词优化
  • 自己怎么开发网站搜索引擎优化服务
  • 中国建筑集团有限公司官网子公司网络优化行业的发展前景
  • jeykll和wordpress兰州seo培训
  • 国内做电商网站培训心得体会1000字通用
  • aspx网站开发教程网页怎么搜索关键词
  • 大学做网站是什么专业b站推广有用吗
  • 武汉网站建设求职简历源码网站
  • 还有哪些网站可以做淘宝活动产品seo怎么优化
  • 网站设计原则外贸推广建站
  • 西安网站建设招骋重庆网站建设哪家好
  • 在百度怎么建立自己的网站吗百度快照收录
  • 佛山做礼物的网站站长工具黄
  • 中国建设银行网站诚聘英才频道如何做一个自己的电商平台
  • 手机小说网站源码网站怎么收录到百度
  • 出纳工作内容湛江seo
  • h5网站建设机构海豹直播nba
  • 茶叶网站建设要求最新消息新闻头条
  • 工作室有专门的网站可以免费发布广告的平台有哪些