📄 scsda.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 + -