ENVI^ ForceLocal=1
//指针长度(PECMD32=4 PECMD64=8)
IFEX #%&bX64%>1, SET &PtrSz=8! SET &PtrSz=4

/////////----------------测试数据----------
ENVI$# &&DriverPackageInfos=*154 00

SET &strPublishedName1=GoodBook
ENVI-addr &&pPublishedName1=&strPublishedName1
ENVI-ptr &DriverPackageInfos=%&pPublishedName1%   //PublishedName=[GoodBook]

SET &str2=OrgGoodBook
ENVI-addr &&pstr2=&str2
ENVI-ptr &DriverPackageInfos=%pstr2%;%&PtrSz%     //OriginalFileName=[OrgGoodBook]

ENVI-int &DriverPackageInfos=12:(%&PtrSz%*2)      //InBox=12
/////////----------------测试数据----------END




///-----------------
// 本例中其实，是先有一个空对象DriverPackageInfos
///////////////////////////////////////////

//指针%&pWimInfo% 返回后，如下方式解开。
//（1）用ENVI-mkfixdummy &&对象=指针;len 虚构一个指针对应的对象
//ENVI-mkfixdummy &&DriverPackageInfos=%&pDriverPackageInfos%;(154)  // 结构长度 找资料，结构的字节数，自己数
//如果本身知道其对象DriverPackageInfos，不用了。
//DismDriverPackage结构体介绍页面https://docs.microsoft.com/zh-cn/windows-hardware/manufacture/desktop/dism/dismdriverpackage-structure
//typedef struct _DismDriverPackage {
//  PCWSTR              PublishedName;  //ptr  //PtrSz (8/4)
//  PCWSTR              OriginalFileName; //ptr  //PtrSz (8/4)
//  BOOL                InBox;    //BOOL //按 int //4B
//  PCWSTR              CatalogFile;  //PtrSz (8/4)
//  PCWSTR              ClassName;    //PtrSz (8/4)
//  PCWSTR              ClassGuid;    //PtrSz (8/4)
//  PCWSTR              ClassDescription; //PtrSz (8/4)
//  BOOL                BootCritical; //BOOL //按 int //4B
//  DismDriverSignature DriverSignature;  //enum //按 int //4B
//  PCWSTR              ProviderName; //PtrSz (8/4)
//  SYSTEMTIME          Date; //16B
//  UINT                MajorVersion; //4B
//  UINT                MinorVersion; //4B
//  UINT                Build;    //4B
//  UINT                Revision; //4B
//} DismDriverPackage;
//152+DismDriverSignature //154

//typedef struct _SYSTEMTIME {  
//    WORD wYear;  //2B
//    WORD wMonth;  
//    WORD wDayOfWeek;  
//    WORD wDay;  
//    WORD wHour;  
//    WORD wMinute;  
//    WORD wSecond;  
//    WORD wMilliseconds;  
//} SYSTEMTIME;  
//8*2=16B

//（2）用  ENVI?数据类型[0]  源ＰＥ变量名=变量名:偏移字节数  获取各数值分量
//（3）用  ENVI-mkfixdummy &&var=&wi@mm;nn 直接获得字符数组成员（已知长度）,结构成员
//     用  ENVI-mkfixdummy &&strVar=%ptr% 获得字符指针（未知长度）的str对象
//（4）数据转为适当形式字符串。如转为可显示的时间串。

Split_DismDriverPackage

_SUB Split_DismDriverPackage
    ENVI?ptr    &DriverPackageInfos=&&ptrPublishedName:0
    ENVI-mkfixdummy &&PublishedName=%ptrPublishedName%  //字符指针（未知长度）的str对象

    ENVI?ptr    &DriverPackageInfos=&&ptrOriginalFileName:%PtrSz%
    ENVI-mkfixdummy &&OriginalFileName=%ptrOriginalFileName%    //字符指针（未知长度）的str对象

    ENVI?int    &DriverPackageInfos=&&InBox:(%PtrSz%*2)

MESS. PublishedName[%&PublishedName%] OriginalFileName[%&OriginalFileName%] InBox[%&InBox%]

_END



