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文件格式相关推荐

  1. scanf_s()函数 (是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数)

    scanf()函数是标准C中提供的标准输入函数,scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数.因为scanf()在读取数据时不检查边界,所以可能会造成 ...

  2. Microsoft公司的匈牙利法命名规则

    Microsoft公司的"匈牙利"法命名规则 比较著名的命名规则当推Microsoft公司的"匈牙利"法,该命名规则的主要思想是"在变量和函数名中加入 ...

  3. 【转】分析现行的常用的文件格式类别

    摘要:讲述现今常见的在特定领域有代表性的文件格式,并没有深入讲述每种格式的存储状态(方式),只对相应格式的特性优缺点做简要概述.   关键字:计算机,文件格式,图形,图像,音频,视频,流媒体,手机铃声 ...

  4. 现行的常用的文件格式类别 简析

    简要的说数据信息在存储器中存储的排列方式不同为啦方便理解和交流规范为不同的文件格式,这点在linux上边可以较为明显的看出:linux只规范不同文件的属性,后缀名是为啦方便记忆和沟通等 -- 图形文件 ...

  5. 分析现行的常用的文件格式类别

    分析现行的常用的文件格式类别 简要的说数据信息在存储器中存储的排列方式不同为啦方便理解和交流规范为不同的文件格式,这点在linux上边可以较为明显的看出:linux只规范不同文件的属性,后缀名是为啦方 ...

  6. 解说文件格式(扩展名)*.*

    什么是文件名后缀  说起来Windows工作界面下的文件名简直是随心所欲,比如:某编辑部的2000年工作计划.文件名即可用中文直接表达,而且长度最长可达256个字符,让人看起来真是一目了然.然而在Wi ...

  7. Microsoft RTF栈溢出漏洞(CVE-2010-3333)漏洞分析

    文章目录 漏洞描述 分析环境 RTF文件格式 基于栈回溯的漏洞分析方法 漏洞利用 Office 2003与Office 2007 Exploit通用性研究 漏洞描述 Microsoft Office ...

  8. 常见多媒体文件格式及视音频编解码总结

    首先要分清楚媒体文件和编码的区别:文件是既包括视频又包括音频.甚至还带有脚本的一个集合,也可以叫容器:文件当中的视频和音频的压缩算法才是具体的编码. 常见的音视频文件格式(容器): MPG:MPEG编 ...

  9. 微软官方知识:了解 Office 二进制文件格式

    摘要:了解有关当前和早期 Microsoft Office 产品中使用的二进制文件格式,包括如何使用它们,其基本结构和以编程方式与其交互的主要概念. 适用范围: Microsoft Word | Mi ...

最新文章

  1. 快速排序java代码_8 种排序算法与 Java 代码实现!
  2. redis和memcached的区别(总结)
  3. 1034. 有理数四则运算(20)
  4. 想捧金饭碗? 修炼这25项技能就够了!
  5. OJ1073: 级数求和(C语言)
  6. 本地调试微信程序ngrok
  7. 苹果2024年推出真全面屏iPhone 但可能只是高端版
  8. 2015/8/30 Python基础(4):序列操作符
  9. 去掉serialVersionUID的警告
  10. Aho-Corasick暂存第二篇
  11. StretchDIBits速度测试(COLORONCOLOR)
  12. SG3525芯片简介
  13. JAVA基础 - 什么是变量和运算符
  14. [转贴]比《同居密友》更搞笑的【阿奴与唐玉】陶海风格
  15. 5.16 按照自定义序列对城市进行排序 [原创Excel教程]
  16. 游戏中掉落效果的实现
  17. 苹果x支持5g吗_【苹果】曝iPhone12双卡下不支持5G?NO!小白实测支持
  18. 小白终是踏上了这条不归路----小文的mysql学习笔记(22)--------函数
  19. 操作系统(四)操作系统的主要功能
  20. java 1m几个字节_1m等于多少kb - 巍巍的个人页面 - OSCHINA - 中文开源技术交流社区...

热门文章

  1. linux上u盘怎么加密,linux使用luks加密硬盘或u盘
  2. Web 编程期中大作业
  3. 20135323符运锦期中总结----Linux系统的理解及学习心得
  4. java枚举类构造方法默认是,枚举类型的构造方法_Java语言程
  5. uniapp吸顶功能实现
  6. MAX7219产品级驱动分享
  7. 曾经无限风光,再看IT业10大过山车人物
  8. [2009.03.22 21:37:00] 肖申克的救赎-The Shawshank
  9. 数据库表的设计什么时候可以存在冗余?
  10. 开发想顺利,流程得明确!