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

📄 scsda.c

📁 PGP8.0源码 请认真阅读您的文件包然后写出其具体功能
💻 C
字号:
/*__________________________________________________________________________
 Copyright (C) 2002 PGP Corporation
 All rights reserved.
 
 $Id: SCsda.c,v 1.9 2002/08/06 20:10:09 dallen Exp $
__________________________________________________________________________*/
#include "precomp.h"
#include "pgpSDACreate.h"

#define NTSIGNATURE(a) ((LPVOID)((BYTE *)a		     +	\
			((PIMAGE_DOS_HEADER)a)->e_lfanew))

FILELIST *ReverseFileList(FILELIST *flin)
{
	FILELIST *flnext,*flout;

	flout=NULL;

	while(flin!=NULL)
	{
		flnext=flin->next;
		
		flin->next=flout;
		flout=flin;

		flin=flnext;
	}

	return (flout);
}

/* Generic event handler */
PGPError
SDAEvents(
	PGPContextRef context,
	SDAEvent *event,
	PGPUserValue userValue
	)
{
	MYSTATE *ms;
	(void) context;

	ms = (MYSTATE *)userValue;

	if(PGPscProgressGetCancel(ms->hwndWorking))
	{	
		return kPGPError_UserAbort;
	}

	switch( event->type ) 
	{
		case kSDAEvent_ErrorEvent:
		{	
			char szMsg[400];
			DWORD dwMsg;
			SDAEventErrorData *d = &event->data.errorData;

			switch(d->err)
			{
				case kPGPError_SizeAdviseFailure:
				{
					DWORD dwRst;

					dwMsg=IDS_OVER4GB;

					LoadString(g_hinst, dwMsg, szMsg,400);
					
					dwRst=MessageBox(ms->hwndWorking,
						szMsg,d->fileName,
						MB_OKCANCEL|MB_SETFOREGROUND|MB_ICONSTOP);

					if(dwRst==IDOK)
					{
						return kPGPError_NoErr;
					}

					return kPGPError_UserAbort;
				}

				default:
				{
					dwMsg=IDS_ERRORENCODING;
					break;
				}
			}

			LoadString(g_hinst, dwMsg, szMsg,200);
					
			MessageBox(ms->hwndWorking,
				szMsg,d->fileName,
				MB_OK|MB_SETFOREGROUND|MB_ICONSTOP);
			break;
		}

		case kSDAEvent_ProgressEvent:
		{	
			SDAEventProgressData *d = &event->data.progressData;

			if(d->bytesTotal!=0)
			{
				return PGPscProgressSetBar(ms->hwndWorking,
					(DWORD)(d->bytesWritten*100/d->bytesTotal),FALSE);
			}
			break;
		}

		case kSDAEvent_NewFileEvent:
		{	
			SDAEventNewFileData *d = &event->data.newfileData;

			PGPscProgressSetNewFilename(ms->hwndWorking,"From '%s'",
				d->fileName,TRUE);
			break;
		}

		case kSDAEvent_GetSDARandomBitsEvent:
		{
			PGPError err;

			SDAEventGetSDARandomBitsData *d = &event->data.randomData;
			err=PGPclRandom(context,ms->hwndWorking,d->EntropyAmount);

			if(IsPGPError(err))
				return err;
			break;
		}

		case kSDAEvent_WriteSDAStubEvent:
		{
			DWORD dwStubSize;
			HRSRC hRCStub;
			HGLOBAL hGBStub;
			char *pStubData;

			SDAEventWriteSDAStubData *d = &event->data.stubData;

			hRCStub=FindResource(g_hinst,
				MAKEINTRESOURCE(IDR_SDASTUB),
				RT_RCDATA);

			dwStubSize=SizeofResource(g_hinst,hRCStub);

			hGBStub=LoadResource(g_hinst,hRCStub);
			pStubData=(char *)LockResource(hGBStub);

			// Sanity checking here for resource munging
			if(!((*(USHORT *)pStubData == IMAGE_DOS_SIGNATURE) &&
		      (*(DWORD *)NTSIGNATURE (pStubData) == IMAGE_NT_SIGNATURE)))
			{
				PGPscMessageBox (ms->hwndWorking,IDS_PGPERROR,IDS_COULDNOTOPENSTUB,
					MB_OK|MB_ICONSTOP);

				return kPGPError_UserAbort;
			}

			// Copy SDA.exe prefix executable into SDA file and
			// set header offset so we can find data again.
			// Write out stub to disk from resources
			fwrite(pStubData,1,dwStubSize,d->fOutput);

			UnlockResource(hGBStub);
			FreeResource(hGBStub);
			break;
		}

		default:
			break;
	}
				
	return kPGPError_NoErr;
}

PGPError SDA(MYSTATE *ms)
{
	PGPError err;
	PGPFileSpecRef filespec;
	char *fullPathPtr;
	BOOL OneDirectory;
	char szOutput[MAX_PATH+1];
	BOOL CancelOperation;
	char szCaption[256];

	ms->ListHead=ReverseFileList(ms->ListHead);

	// Check to see if we only have one directory with contents
	OneDirectory=ms->ListHead->IsDirectory;

	strcpy(szOutput,ms->ListHead->name);
	strcat(szOutput,".sda.exe");

	if(OneDirectory)
	{
		LoadString (g_hinst, IDS_FILECONFLICT, szCaption, sizeof(szCaption));

		// Do automatically if possible
		CancelOperation=SaveOutputFile(ms->context,
			ms->hwndWorking, 
			szCaption,
			szOutput, 
			&filespec,
			FALSE);
	}
	else
	{
		LoadString (g_hinst, IDS_CONFIRMSDANAME, szCaption, sizeof(szCaption));

		// Always check with the user first
		CancelOperation=SaveOutputFile(ms->context,
			ms->hwndWorking, 
			szCaption,
			szOutput, 
			&filespec,
			TRUE);
	}

	if(CancelOperation)
		return kPGPError_UserAbort;

	PGPGetFullPathFromFileSpec( filespec,
		&fullPathPtr);

	strcpy(szOutput,fullPathPtr);
	PGPFreeData(fullPathPtr);
	PGPFreeFileSpec(filespec);

	err=SDACreate(ms->context,ms->ListHead,
		szOutput,ms->ConvPassPhrase,
		SDAEvents,ms, 0);

	ms->ListHead=ReverseFileList(ms->ListHead);

	return err;
}

/*__Editor_settings____

	Local Variables:
	tab-width: 4
	End:
	vi: ts=4 sw=4
	vim: si
_____________________*/

⌨️ 快捷键说明

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