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); 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: microsoft_netfx3.cab是.NET Framework 3.0安装程序所需要的一个文件包。在Windows操作系统中,.NET Framework是一种为开发和执行基于Windows的应用程序而创建的框架。它提供了许多开发工具和类库,以方便开发人员和程序员开发和实现多种类型的应用程序。 当用户尝试安装.NET Framework 3.0时,安装程序会自动寻找相应的文件包,并从中提取必要的文件。而microsoft_netfx3.cab就是其中的一个重要组件,它包含了安装.NET Framework所需的许多程序文件和资源文件。在安装程序运行时,它会被自动下载或直接从光盘中获取,这样就可以保证.NET Framework在安装时正常运行。 总之,microsoft_netfx3.cab是.NET Framework 3.0安装程序所必需的文件包,它包含了许多必要的程序文件和资源文件,为.NET Framework的安装提供了重要的支持。 ### 回答2: microsoft_netfx3.cab是Windows操作系统中一个重要的文件,它与.NET Framework 3.5版本有关。对于需要运行.NET Framework 3.5应用程序的用户来说,这个文件是必需的。 .NET Framework是一个由微软公司开发的应用程序框架,它提供了一系列的编程接口和工具,方便开发者编写应用程序。而.NET Framework 3.5是.NET Framework的一个早期版本,它提供了很多常用的编程接口和功能库,如Windows Communication Foundation(WCF)、Windows Presentation Foundation(WPF)等,这些接口和功能库在编写应用程序时有很大的帮助。 microsoft_netfx3.cab文件包含了.NET Framework 3.5安装程序的一部分,它包含了程序所需的一些核心组件和文件。当用户需要安装.NET Framework 3.5时,安装程序会自动检查系统中是否存在这个文件,如果不存在就会自动下载和安装。 总之,microsoft_netfx3.cab对于一些需要运行.NET Framework 3.5应用程序的用户来说是非常重要的,如果没有它,将无法正常使用相关应用程序。同时,用户可以通过一些方法自行备份和保存这个文件,以方便未来的使用或恢复。 ### 回答3: microsoft_netfx3.cab是一个微软Windows操作系统组件的安装包。它包含了.NET Framework 3.5 SP1(Service Pack 1)安装所需要的文件,如DLL文件、配置文件、资源文件等等。 .NET Framework是微软开发的一个应用程序开发框架,它提供一系列构建和执行基于Windows的应用程序的服务,尤其是在创建使用网络的程序时,它是必需的。而NET Framework 3.5 SP1则是.NET Framework的一个重要的升级版本,它可以在Windows 7、Windows 8或Windows 10操作系统中,提供更好的支持并提升了应用程序的性能,同时也增加了一些新的功能。 如果您需要安装.NET Framework 3.5 SP1,则需要通过microsoft_netfx3.cab文件来进行安装。通常情况下,在Windows操作系统中启用.NET Framework 3.5 SP1功能所需的文件已经预先安装在操作系统中。但有时您可能需要对操作系统进行一些更改或重新安装该组件。此时,您可以通过microsoft_netfx3.cab文件手动安装该组件,以便获得更好的性能和功能。 总的来说,microsoft_netfx3.cab文件是一个必要的微软Windows操作系统组件安装包,它包含了.NET Framework 3.5 SP1所需的全部文件。如果您需要将.NET Framework 3.5 SP1安装到您的计算机上,您可以通过该安装包来手动安装该组件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值