windows-nt/Source/XPSP1/NT/base/ntsetup/legacy/dll/dcmpstub.c
2020-09-26 16:20:57 +08:00

198 lines
4.3 KiB
C

#include "precomp.h"
#pragma hdrstop
/*
* Stubs for decompression routines. They just copy the file instead of
* decompressing it.
*
* Only routines actually used by the toolkit are included.
*/
#define MIN_BUFFER_SIZE 2048 // must be a multiple of 2
#define MAX_BUFFER_SIZE (2*65536) // must be a multiple of 2
LONG
LcbCopyFile(
HANDLE fhSrc,
HANDLE fhDest,
PFNWFROMW pfn,
INT cProgTicks
)
{
BYTE StaticBuffer[MIN_BUFFER_SIZE],*CopyBuffer;
DWORD br,bw;
DWORD BufferSize,FileSize,TicksPerCycle=0;
LONG DistanceHigh = 0L;
LONG RC;
if((FileSize = GetFileSize(fhSrc,NULL)) == (DWORD)(-1)) {
return(rcReadError);
}
//
// Rewind to beginning of file
//
if(SetFilePointer(fhSrc, 0L, &DistanceHigh, FILE_BEGIN) == 0xFFFFFFFF) {
return (rcReadSeekError);
}
BufferSize = MAX_BUFFER_SIZE;
while((BufferSize > MIN_BUFFER_SIZE)
&& ((CopyBuffer = SAlloc(BufferSize)) == NULL))
{
BufferSize /= 2;
}
if(CopyBuffer == NULL) {
CopyBuffer = StaticBuffer;
BufferSize = sizeof(StaticBuffer);
}
if(FileSize) {
TicksPerCycle = BufferSize*(DWORD)cProgTicks/FileSize;
}
if(TicksPerCycle > (DWORD)cProgTicks) {
TicksPerCycle = (DWORD)cProgTicks;
}
while(1) {
if(!ReadFile(fhSrc,CopyBuffer,BufferSize,&br,NULL)) {
RC = rcReadError;
break;
} else if(!br) { // ReadFile returned TRUE and bytesread = 0
RC = rcNoError;
break;
}
FYield();
if ( fUserQuit ) {
RC = rcUserQuit;
break;
}
if(!WriteFile(fhDest,CopyBuffer,br,&bw,NULL) || (br != bw)) {
// the !RC test guesses that br != bw means disk full
if(((RC = GetLastError()) == ERROR_DISK_FULL) || !RC) {
RC = rcDiskFull;
} else {
RC = rcWriteError;
}
break;
}
FYield();
if ( fUserQuit ) {
RC = rcUserQuit;
break;
}
if(pfn != NULL) {
pfn(TicksPerCycle);
}
}
if(CopyBuffer != StaticBuffer) {
SFree(CopyBuffer);
}
return(RC);
}
LONG
LcbDecompFile(
HANDLE fhSrc,
HANDLE fhDest,
PFNWFROMW pfn,
INT cProgTicks
)
{
BYTE StaticBuffer[MIN_BUFFER_SIZE],*CopyBuffer;
DWORD br,bw;
DWORD BufferSize,FileSize,TicksPerCycle=0;
LONG RC;
//
// Use seek to determine file length
//
if(( RC = LZSeek( HandleToUlong(fhSrc), 0L, 2 ) ) < 0) {
return (rcReadSeekError);
}
FileSize = (DWORD)RC;
//
// Rewind to beginning of file
//
if(( RC = LZSeek( HandleToUlong(fhSrc), 0L, 0 ) ) < 0) {
return (rcReadSeekError);
}
//
// Copy source file to destination file BufferSize at a time
//
BufferSize = MAX_BUFFER_SIZE;
while((BufferSize > MIN_BUFFER_SIZE)
&& ((CopyBuffer = SAlloc(BufferSize)) == NULL))
{
BufferSize /= 2;
}
if(CopyBuffer == NULL) {
CopyBuffer = StaticBuffer;
BufferSize = sizeof(StaticBuffer);
}
if(FileSize) {
TicksPerCycle = BufferSize*(DWORD)cProgTicks/FileSize;
}
if(TicksPerCycle > (DWORD)cProgTicks) {
TicksPerCycle = (DWORD)cProgTicks;
}
while(1) {
if((RC = LZRead( HandleToUlong(fhSrc),CopyBuffer,BufferSize) ) < 0) {
RC = rcReadError;
break;
} else if(!RC) { // No error and bytesread = 0
RC = rcNoError;
break;
}
br = (DWORD)RC;
FYield();
if ( fUserQuit ) {
RC = rcUserQuit;
break;
}
if(!WriteFile(fhDest,CopyBuffer,br,&bw,NULL) || (br != bw)) {
// the !RC test guesses that br != bw means disk full
if(((RC = GetLastError()) == ERROR_DISK_FULL) || !RC) {
RC = rcDiskFull;
} else {
RC = rcWriteError;
}
break;
}
FYield();
if ( fUserQuit ) {
RC = rcUserQuit;
break;
}
if(pfn != NULL) {
pfn(TicksPerCycle);
}
}
if(CopyBuffer != StaticBuffer) {
SFree(CopyBuffer);
}
return(RC);
}