资源简介
用于从微软补丁包.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
- 上一篇:按键中断流水灯
- 下一篇:C51的数字时钟.rar
相关资源
- MSP430F149 最小系统板原理图
- PWM输出程序 MSP430
- 3款MSP430反汇编反编译工具软件
- msp430 日历、时间、显示温度
- 基于430单片机的万年历程序
- MSP430F149+DS18B20+1602程序绝对好用
- MSP430芯片的密码锁软件设计.pdf
- msp430g2553单片机定时器中断例程
- msp430f149超声波雷达
- MSP430利用定时器测频率
- 基于msp430智能小车程序
- MSP430G2553和DS1302时钟程序
- 基于msp430智能家居程序
- ADF4350单片机MSP430控制程序
- 基于MSP430制作MP3源程序
- 基于MSP430单片机的交流电压测量设计
- msp430的pwm程序
- LCD12864实现贪吃蛇游戏
- MSP430F149利用硬件SPI口读写串行Flash
- MSP430PID模块化程序
- MSP430 单片机读写SD卡程序带fat文件系
- msp430 模块程序 包括DS18B20 PS2 串口 电
- MSP430单片机的实时多任务操作系统c源
- Nokia5110的程序在msp430G2553上可以
- msp430F149应用电路原理图
- DAC7811的驱动程序基于MSP430
- msp430FFT程序
- 自定义方法实现msp和json互转(底层实
- 基于msp430实现电子时钟程序
- AD9850的msp430串行程序
评论
共有 条评论