• 大小: 360KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-22
  • 语言: 其他
  • 标签: msp  文件提取  

资源简介

用于从微软补丁包.msp文件中,直接extract出文件

资源截图

代码片段和文件信息


#include “msix.h“
#pragma comment(lib “msi.lib“)

// Entry point.
int _tmain(int argc _TCHAR* argv[])
{
DWORD dwError = NOERROR;
HRESULT hr = NOERROR;
    ARGS args = { 0 };
IStorage* pRootStorage = NULL;
    IEnumSTATSTG* pEnum = NULL;
LPCTSTR pszPersist = (LPTSTR)MSIDBOPEN_READONLY;
    STATSTG stg = { 0 };
PMSIHANDLE hDatabase = NULL;
    PMSIHANDLE hView = NULL;
    PMSIHANDLE hRecord = NULL;

    dwError = ParseArguments(argc argv &args);
    if (ERROR_SUCCESS != dwError)
    {
        return dwError;
    }

// Open the root storage file and extract storages first. Storages cannot
    // be extracted using MSI APIs so we must use the compound file implementation
    // for IStorage.
hr = StgOpenStorage(
CT2W(args.Path)
NULL
STGM_READ | STGM_SHARE_EXCLUSIVE
NULL
0
&pRootStorage);
if (SUCCEEDED(hr) && pRootStorage)
{
// Determine if the file path specifies an MSP file.
        // This will be used later to open the database with MSI APIs.
if (IsPatch(pRootStorage))
{
pszPersist = MSIDBOPEN_READONLY + MSIDBOPEN_PATCHFILE;
}

        hr = pRootStorage->EnumElements(0 NULL 0 &pEnum);
        if (SUCCEEDED(hr))
        {
            while (S_OK == (hr = pEnum->Next(1 &stg NULL)))
            {
                if (STGTY_STORAGE == stg.type)
                {
                    hr = SaveStorage(pRootStorage args.Directory stg.pwcsName
                        args.IncludeExtension ? TEXT(“.mst“) : NULL);
                    if (FAILED(hr))
                    {
                        break;
                    }
                }
            }
            SAFE_RELEASE(pEnum);
        }
}
SAFE_RELEASE(pRootStorage);

    // Now open the database using MSI APIs. Patches cannot be opened simultaneously
    // since exclusive access is required and no MSI APIs are exported that accept
    // an IStorage pointer.
    if (SUCCEEDED(hr))
    {
        dwError = MsiOpenDatabase(args.Path pszPersist &hDatabase);
        if (ERROR_SUCCESS == dwError)
        {
            dwError = MsiDatabaseOpenView(hDatabase
                TEXT(“SELECT ‘Name‘ ‘Data‘ FROM ‘_Streams‘“) &hView);
            if (ERROR_SUCCESS == dwError)
            {
                dwError = MsiViewExecute(hView NULL);
                if (ERROR_SUCCESS == dwError)
                {
                    while (ERROR_SUCCESS == (dwError = MsiViewFetch(hView &hRecord)))
                    {
                        dwError = SaveStream(hRecord args.Directory args.IncludeExtension);
                        if (ERROR_SUCCESS != dwError)
                        {
                            break;
                        }
                    }

                    // If there are no more records indicate success.
                    if (ERROR_NO_MORE_ITEMS == dwError)
                    {
                        dwError = ERROR_SUCCESS;
        

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        5267  2006-04-06 17:47  MsiX.h
     文件        2437  2006-04-06 17:57  MsiX.rc
     文件        4219  2006-04-06 17:57  MsiX.vcproj
     文件         398  2006-04-06 17:55  resource.h
     文件      139264  2006-04-06 17:59  Release\MsiX.exe
     文件     1412096  2006-04-06 17:59  Release\MsiX.pdb
     目录           0  2006-04-06 18:00  Release\
     文件       14665  2006-04-06 17:47  MsiX.cpp

评论

共有 条评论