winImageSdk Simple

来源:互联网 发布:淘宝全国包邮图片 编辑:程序博客网 时间:2024/05/22 13:43

http://www.winimage.com/wima_sdk.htm

/* sample written by Nathan Moinvaziri [nmoinvaziri@yahoo.com] */



#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <memory.h>
#include <string.h>


#include <windows.h>


#include "wimadll.h"


class CUnIMG
{
public:


CUnIMG() {};
~CUnIMG() {};


int ExtractIMG(LPSTR lpszImageFileName, LPSTR lpszDestDir);


private:


char szPath[MAX_PATH];
char szHemp[MAX_PATH];
char szTemp[MAX_PATH];


static DWORD WINAPI ExCB(DWORD, DWORD, DWORD, LPVOID, LPVOID);


HIMA ProcessDIR(HIMA hIma, LPCSTR lpszCurrDir, LPCSTR lpszDestDir, UINT nFlags);
};


char szComp[MAX_PATH];


const int ISO_GETSIZE = 0;
const int ISO_EXTRACT = 1;


DWORD dwImaSize = 0;
DWORD dwImaSizeFinished = 0;
DWORD dwCurSize = 0;


DWORD WINAPI CUnIMG::ExCB(DWORD dwEvent, DWORD dwEventParam,DWORD dwWin32Err, LPVOID lpParam,LPVOID lpUsrParam)
{
PROGRESSFILE_SUPINFO* hTmp = (PROGRESSFILE_SUPINFO*)lpParam;


if(strcmp(szComp, hTmp->lpszName) != 0)
{
strcpy(szComp, hTmp->lpszName);


dwImaSizeFinished += dwCurSize;
dwCurSize = hTmp->dwTotalSize;


//n++;
}


//printf("dwImaSize: %f", ;


if(hTmp->dwTotalSize != 0)
printf("   Iso - %2.02f%% %u/%u, %s - %2.02f%% %u/%u\n", (float)(dwImaSizeFinished + hTmp->dwCurrentPos)/dwImaSize*100, dwImaSizeFinished + hTmp->dwCurrentPos, dwImaSize, hTmp->lpszFullName, (float)hTmp->dwCurrentPos/hTmp->dwTotalSize*100, hTmp->dwCurrentPos, hTmp->dwTotalSize);


return 0; // 2 to stop extraction
}




HIMA CUnIMG::ProcessDIR(HIMA hIma, LPCSTR lpszCurrDir, LPCSTR lpszDestDir, UINT nFlags)
{
    if (hIma == NULL)
{
printf("hIma was null\n");
return hIma;
}

::CreateDirectory(lpszDestDir, NULL);


    DWORD dwNbFileRoot = GetNbEntryCurDir(hIma);


DIRINFO* lpdi = (DIRINFO*)new char[sizeof(DIRINFO)*(dwNbFileRoot+1)];

    if (GetDirInfo(hIma, lpdi, SORT_NONE))
{
printf("Current Directory: %s %d Files\n", lpszCurrDir, dwNbFileRoot);


// count file sizes
if(nFlags == ISO_GETSIZE)
        for (DWORD i=0;i<dwNbFileRoot;i++)
if(lpdi[i].szCompactName[0] != '.' && !lpdi[i].fIsSubDir)
dwImaSize += lpdi[i].dwSize;


// extract files and folders
if(nFlags == ISO_EXTRACT)
        for (DWORD i=0;i<dwNbFileRoot;i++)
{
if(lpdi[i].szCompactName[0] != '.')
{
strcpy(szPath, lpszDestDir);
strcat(szPath, lpszCurrDir);


if(lpszCurrDir != "")
strcat(szPath, "\\");


strcpy(szTemp, szPath);


if(lpdi[i].fLfnEntry)
strcat(szPath, (lpdi+i)->longname);
else
strcat(szPath, (lpdi+i)->szCompactName);


if((int)((lpdi+i)->bAttr) == 16)
::CreateDirectory(szPath, NULL);
else
{
if(ExtractFileCB(hIma, (EVENTNOTIFCALLBACK)ExCB, NULL, (lpdi+i)->uiPosInDir, szTemp, NULL))
printf("Extracted %s\n", szPath);
else
printf("Unable to extract file %s\n", szPath);
}
}
}


        for (DWORD i = 0; i < dwNbFileRoot; i++)
{
if(lpdi[i].szCompactName[0] != '.' && lpdi[i].fIsSubDir)
{
                //char szHemp[MAX_PATH]; // GV : moved here (for recursion)


if(!ChDirPos(hIma, CDM_ENTRY, lpdi[i].uiPosInDir)) 
// Debug error here, doesn't goto printf. 
// Doesn't return anything.
printf("Unable to move to next directory.\n");


strcpy(szHemp, lpszCurrDir);


                int iLnHemp = lstrlen(szHemp);

if(lpszCurrDir != "")
strcat(szHemp, "\\");


if(lpdi[i].fLfnEntry)
strcat(szHemp, lpdi[i].longname);
else
strcat(szHemp, lpdi[i].szCompactName);


if(ProcessDIR(hIma, szHemp, lpszDestDir, nFlags) == NULL)
printf("Err ProcessDIR returned NULL.\n");


                szHemp[iLnHemp]  = '\0';


if(!ChDir(hIma, CDM_UPPER))
printf("Unable to go back to prev. directory.\n");
}
}
}


delete lpdi;


return hIma;
}


int CUnIMG::ExtractIMG(LPSTR lpszImageFileName, LPSTR lpszDestDir)
{
    HIMA hIma = CreateCDIsoIma(lpszImageFileName);


    if (hIma != NULL)
        printf("ISO CdRom image %s opened\n",lpszImageFileName);
    else
    {
  DWORD dwSizeIma,dwSizeImaHigh;       
        BOOL fOpenLargeFat=FALSE;
        DWORD dwPosInFile=0;


        if (GetFatImaSizeFileName(lpszImageFileName,&dwSizeIma,&dwSizeImaHigh,&fOpenLargeFat,&dwPosInFile))
        {
            hIma = OpenFatLargeFile(NULL,lpszImageFileName,0,0,TRUE);


            if (hIma != NULL)
                printf("Hard disk image %s opened\n\n",lpszImageFileName);
else
printf("Cannot open image %s\n\n",lpszImageFileName);
        }


        if ((hIma == NULL) && (!fOpenLargeFat))
        {
BOOL fCompr = FALSE;


hIma = CreateMemFatHima();


if (hIma != NULL)
{
if (!ReadImaFile(hIma,/*NULL*/HWND_NO_PROGRESS, lpszImageFileName, &fCompr, 0))
{
DeleteIma(hIma);
hIma= NULL;
}
else
printf("Fat Floppy image %s opened\n\n",lpszImageFileName);
}
        }
    }


dwImaSize = 0;
dwImaSizeFinished = 0;


ProcessDIR(hIma, "", lpszDestDir, ISO_GETSIZE);

if(hIma == NULL)
printf("Error in ProcessDIR\n");

ProcessDIR(hIma, "", lpszDestDir, ISO_EXTRACT);




DeleteIma(hIma);


return (hIma == NULL) ? 0 : 1;
}




int main(int argc,char *argv[])
{
CUnIMG hImg;
    LPSTR lpszImageFileName;
    LPSTR lpszDestDir;


    if (argc>=3)
    {
        lpszImageFileName = argv[1];
        lpszDestDir = argv[2];
    }
    else
    {
        lpszImageFileName = "c:\\iso.iso" ;
        lpszDestDir = "c:\\temp\\";
    }


if(!hImg.ExtractIMG(lpszImageFileName, lpszDestDir))
printf("\nError occured while extracting.\n");
else
printf("\nAll files extracted successfully.\n");


//while(1);
return 0;
}
0 0
原创粉丝点击