⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 extimage.cpp

📁 对ima、imz压缩文件修改
💻 CPP
字号:
/* 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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -