in src/main/cpp/launcher/windows/src/ExtractUtils.c [304:390]
void extractDataToFile(LauncherProperties * props, WCHAR *output, int64t * fileSize, DWORD expectedCRC ) {
if(isOK(props)) {
DWORD * status = & props->status;
HANDLE hFileRead = props->handler;
int64t * size = fileSize;
DWORD counter = 0;
DWORD crc32 = -1L;
HANDLE hFileWrite = CreateFileW(output, GENERIC_READ | GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, hFileRead);
if (hFileWrite == INVALID_HANDLE_VALUE) {
WCHAR * err;
writeMessageA(props, OUTPUT_LEVEL_DEBUG, 0, "[ERROR] Can`t create file ", 0);
writeMessageW(props, OUTPUT_LEVEL_DEBUG, 0, output, 1);
err = getErrorDescription(GetLastError());
writeMessageA(props, OUTPUT_LEVEL_DEBUG, 0, "Error description : ", 0);
writeMessageW(props, OUTPUT_LEVEL_DEBUG, 0, err, 1);
showErrorW(props, OUTPUT_ERROR_PROP, 2, output, err);
FREE(err);
*status = ERROR_INPUTOUPUT;
return;
}
if(props->restOfBytes->length!=0 && props->restOfBytes->bytes!=NULL) {
//check if the data stored in restBytes is more than we neen
// rest bytes contains much less than int64t so we operate here only bith low bits of size
DWORD restBytesToWrite = (compare(size, props->restOfBytes->length)> 0 ) ? props->restOfBytes->length : size->Low;
DWORD usedBytes = restBytesToWrite;
char *ptr = props->restOfBytes->bytes;
DWORD write = 0;
while (restBytesToWrite >0) {
WriteFile(hFileWrite, ptr, restBytesToWrite, &write, 0);
update_crc32(&crc32, ptr, write);
restBytesToWrite -= write;
ptr +=write;
}
modifyRestBytes(props->restOfBytes, usedBytes);
minus(size, usedBytes);
}
if(compare(size, 0) > 0 ) {
DWORD bufferSize = props->bufsize;
char * buf = newpChar(bufferSize);
DWORD bufsize = (compare(size, bufferSize) > 0) ? bufferSize : size->Low;
DWORD read = 0 ;
// printf("Using buffer size: %u/%u\n", bufsize, bufferSize);
while (ReadFile(hFileRead, buf, bufsize, &read, 0) && read && compare(size, 0) > 0) {
addProgressPosition(props, read);
WriteFile(hFileWrite, buf, read, &read, 0);
update_crc32(&crc32, buf, read);
minus(size, read);
if((compare(size, bufsize)<0) && (compare(size, 0)>0) ) {
bufsize = size->Low;
}
ZERO(buf, sizeof(char) * bufferSize);
if(compare(size, 0)==0) {
break;
}
if((counter ++) % 20 == 0) {
if(isTerminated(props)) break;
}
}
if((compare(size, 0)>0 || read==0) && !isTerminated(props)) {
// we could not read requested size
* status = ERROR_INTEGRITY;
writeMessageA(props, OUTPUT_LEVEL_DEBUG, 1,
"Can`t read data from file : not enought data", 1);
}
FREE(buf);
}
CloseHandle(hFileWrite);
crc32=~crc32;
if(isOK(props) && crc32!=expectedCRC) {
writeDWORD(props, OUTPUT_LEVEL_DEBUG, 0, "expected CRC : ", expectedCRC, 1);
writeDWORD(props, OUTPUT_LEVEL_DEBUG, 0, "real CRC : ", crc32, 1);
* status = ERROR_INTEGRITY;
}
}
}