Microsoft公司 .CAB文件格式
Microsoft公司 .CAB文件格式
_Inside Windows Cabinet Files_
Listing One
// =================================================================
// CAB FILE LAYOUT
// =================================================================
/*
(1) CAB_HEADER structure
(2) Reserved area, if CAB_HEADER.flags & CAB_FLAG_RESERVE
(3) Previous cabinet name, if CAB_HEADER.flags & CAB_FLAG_HASPREV
(4) Previous disk name, if CAB_HEADER.flags & CAB_FLAG_HASPREV
(5) Next cabinet name, if CAB_HEADER.flags & CAB_FLAG_HASNEXT
(6) Next disk name, if CAB_HEADER.flags & CAB_FLAG_HASNEXT
(7) CAB_FOLDER structures (n = CAB_HEADER.cFolders)
(8) CAB_ENTRY structures / file names (n = CAB_HEADER.cFiles)
(9) File data (offset = CAB_FOLDER.coffCabStart)
*/
// =================================================================
// MACROS
// =================================================================
#define SWAPWORD(x) ((WORD) (((x) << 8) | ((x) >> 8)))
#define SWAPDWORD(x) ((SWAPWORD ((WORD) (x)) << 16) | /
(SWAPWORD ((WORD) ((x) >> 16))))
// =================================================================
// CONSTANTS
// =================================================================
#define CAB_SIGNATURE SWAPDWORD ('MSCF')
#define CAB_VERSION 0x0103
#define CAB_FLAG_HASPREV 0x0001
#define CAB_FLAG_HASNEXT 0x0002
#define CAB_FLAG_RESERVE 0x0004
#define CAB_ATTRIB_READONLY 0x0001
#define CAB_ATTRIB_HIDDEN 0x0002
#define CAB_ATTRIB_SYSTEM 0x0004
#define CAB_ATTRIB_VOLUME 0x0008
#define CAB_ATTRIB_DIRECTORY 0x0010
#define CAB_ATTRIB_ARCHIVE 0x0020
#define CAB_FILE_FIRST 0x0000
#define CAB_FILE_NEXT 0x0001
#define CAB_FILE_SPLIT 0xFFFE
#define CAB_FILE_CONTINUED 0xFFFD
#define CAB_NOTIFY_OK 1
#define CAB_NOTIFY_ERROR 0
#define CAB_NOTIFY_SKIP 0
#define CAB_NOTIFY_ABORT (-1)
// =================================================================
// CABINET STRUCTURES
// =================================================================
typedef struct _CAB_HEADER
{
DWORD sig; // file signature 'MSCF' (CAB_SIGNATURE)
DWORD csumHeader; // header checksum (0 if not used)
DWORD cbCabinet; // cabinet file size
DWORD csumFolders; // folders checksum (0 if not used)
DWORD coffFiles; // offset of first CAB_ENTRY
DWORD csumFiles; // files checksum (0 if not used)
WORD version; // cabinet version (CAB_VERSION)
WORD cFolders; // number of folders
WORD cFiles; // number of files
WORD flags; // cabinet flags (CAB_FLAG_*)
WORD setID; // cabinet set id
WORD iCabinet; // zero-based cabinet number
}
CAB_HEADER, *PCAB_HEADER;
#define CAB_HEADER_ sizeof (CAB_HEADER)
// -----------------------------------------------------------------
typedef struct _CAB_FOLDER
{
DWORD coffCabStart; // offset of folder data
WORD cCFData; // ???
WORD typeCompress; // compression type (tcomp* in FDI.h)
}
CAB_FOLDER, *PCAB_FOLDER;
#define CAB_FOLDER_ sizeof (CAB_FOLDER)
// -----------------------------------------------------------------
typedef struct _CAB_ENTRY
{
DWORD cbFile; // uncompressed file size
DWORD uoffFolderStart; // file offset after decompression
WORD iFolder; // file control id (CAB_FILE_*)
WORD date; // file date stamp, as used by DOS
WORD time; // file time stamp, as used by DOS
WORD attribs; // file attributes (CAB_ATTRIB_*)
}
CAB_ENTRY, *PCAB_ENTRY;
#define CAB_ENTRY_ sizeof (CAB_ENTRY)
Listing Two
// =================================================================
// FILE EXTRACTION CALLBACK
// =================================================================
int DIAMONDAPI FDIExtract (FDINOTIFICATIONTYPE fdint,
PFDINOTIFICATION pfdin)
{
FILETIME ft, lft;
BYTE abFile [MAX_PATH];
int hf, iResult;
switch (fdint)
{
case fdintCOPY_FILE:
if (lstrcmpi (pfdin->psz1,
((PEXTRACT_FILE) pfdin->pv)->pbEntry))
{
iResult = CAB_NOTIFY_SKIP;
}
else
{
hf = FDIOpen (((PEXTRACT_FILE) pfdin->pv)->pbFile,
_O_RDWR | _O_CREAT | _O_TRUNC,
_S_IREAD | _S_IWRITE);
if (hf != -1)
{
iResult = hf;
}
else
{
printfMessage
(((PEXTRACT_FILE) pfdin->pv)->hWnd,
MB_ICONERROR | MB_OK,
"CabLib Error",
"Unable to create file /"%s/"",
((PEXTRACT_FILE) pfdin->pv)->pbFile);
iResult = CAB_NOTIFY_ABORT;
}
}
break;
case fdintNEXT_CABINET:
if (lstrlen (pfdin->psz3) + lstrlen (pfdin->psz1)
< MAX_PATH)
{
lstrcpy (abFile, pfdin->psz3);
lstrcat (abFile, pfdin->psz1);
hf = FDIOpen (abFile, _O_RDONLY, 0);
}
else
{
hf = -1;
}
if (hf != -1)
{
FDIClose (hf);
iResult = CAB_NOTIFY_OK;
}
else
{
printfMessage (((PEXTRACT_FILE) pfdin->pv)->hWnd,
MB_ICONERROR | MB_OK,
"CabLib Error",
"Unable to open file /"%s%s/"",
pfdin->psz3,
pfdin->psz1);
iResult = CAB_NOTIFY_ABORT;
}
break;
case fdintCLOSE_FILE_INFO:
DosDateTimeToFileTime (pfdin->date, pfdin->time, &lft);
LocalFileTimeToFileTime (&lft, &ft);
SetFileTime ((HANDLE) pfdin->hf, &ft, &ft, &ft);
if (FDIClose (pfdin->hf) == -1)
{
printfMessage (((PEXTRACT_FILE) pfdin->pv)->hWnd,
MB_ICONERROR | MB_OK,
"CabLib Error",
"Unable to close file /"%s/"",
((PEXTRACT_FILE) pfdin->pv)->pbFile);
}
iResult = CAB_NOTIFY_OK;
break;
default:
iResult = CAB_NOTIFY_OK;
break;
}
return iResult;
}
Example 1:
HFDI FAR DIAMONDAPI FDICreate (PFNALLOC pfnalloc,
PFNFREE pfnfree,
PFNOPEN pfnopen,
PFNREAD pfnread,
PFNWRITE pfnwrite,
PFNCLOSE pfnclose,
PFNSEEK pfnseek,
int cpuType,
PERF perf);
Example 2:
BOOL FAR DIAMONDAPI FDICopy (HFDI hfdi,
char FAR *pszCabinet,
char FAR *pszCabPath,
int flags,
PFNFDINOTIFY pfnfdin,
PFNFDIDECRYPT pfnfdid,
void FAR *pvUser);
4
Microsoft公司 .CAB文件格式相关推荐
- scanf_s()函数 (是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数)
scanf()函数是标准C中提供的标准输入函数,scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数.因为scanf()在读取数据时不检查边界,所以可能会造成 ...
- Microsoft公司的匈牙利法命名规则
Microsoft公司的"匈牙利"法命名规则 比较著名的命名规则当推Microsoft公司的"匈牙利"法,该命名规则的主要思想是"在变量和函数名中加入 ...
- 【转】分析现行的常用的文件格式类别
摘要:讲述现今常见的在特定领域有代表性的文件格式,并没有深入讲述每种格式的存储状态(方式),只对相应格式的特性优缺点做简要概述. 关键字:计算机,文件格式,图形,图像,音频,视频,流媒体,手机铃声 ...
- 现行的常用的文件格式类别 简析
简要的说数据信息在存储器中存储的排列方式不同为啦方便理解和交流规范为不同的文件格式,这点在linux上边可以较为明显的看出:linux只规范不同文件的属性,后缀名是为啦方便记忆和沟通等 -- 图形文件 ...
- 分析现行的常用的文件格式类别
分析现行的常用的文件格式类别 简要的说数据信息在存储器中存储的排列方式不同为啦方便理解和交流规范为不同的文件格式,这点在linux上边可以较为明显的看出:linux只规范不同文件的属性,后缀名是为啦方 ...
- 解说文件格式(扩展名)*.*
什么是文件名后缀 说起来Windows工作界面下的文件名简直是随心所欲,比如:某编辑部的2000年工作计划.文件名即可用中文直接表达,而且长度最长可达256个字符,让人看起来真是一目了然.然而在Wi ...
- Microsoft RTF栈溢出漏洞(CVE-2010-3333)漏洞分析
文章目录 漏洞描述 分析环境 RTF文件格式 基于栈回溯的漏洞分析方法 漏洞利用 Office 2003与Office 2007 Exploit通用性研究 漏洞描述 Microsoft Office ...
- 常见多媒体文件格式及视音频编解码总结
首先要分清楚媒体文件和编码的区别:文件是既包括视频又包括音频.甚至还带有脚本的一个集合,也可以叫容器:文件当中的视频和音频的压缩算法才是具体的编码. 常见的音视频文件格式(容器): MPG:MPEG编 ...
- 微软官方知识:了解 Office 二进制文件格式
摘要:了解有关当前和早期 Microsoft Office 产品中使用的二进制文件格式,包括如何使用它们,其基本结构和以编程方式与其交互的主要概念. 适用范围: Microsoft Word | Mi ...
最新文章
- 快速排序java代码_8 种排序算法与 Java 代码实现!
- redis和memcached的区别(总结)
- 1034. 有理数四则运算(20)
- 想捧金饭碗? 修炼这25项技能就够了!
- OJ1073: 级数求和(C语言)
- 本地调试微信程序ngrok
- 苹果2024年推出真全面屏iPhone 但可能只是高端版
- 2015/8/30 Python基础(4):序列操作符
- 去掉serialVersionUID的警告
- Aho-Corasick暂存第二篇
- StretchDIBits速度测试(COLORONCOLOR)
- SG3525芯片简介
- JAVA基础 - 什么是变量和运算符
- [转贴]比《同居密友》更搞笑的【阿奴与唐玉】陶海风格
- 5.16 按照自定义序列对城市进行排序 [原创Excel教程]
- 游戏中掉落效果的实现
- 苹果x支持5g吗_【苹果】曝iPhone12双卡下不支持5G?NO!小白实测支持
- 小白终是踏上了这条不归路----小文的mysql学习笔记(22)--------函数
- 操作系统(四)操作系统的主要功能
- java 1m几个字节_1m等于多少kb - 巍巍的个人页面 - OSCHINA - 中文开源技术交流社区...