//----------------------------------------------------------------- // set text color void mgTextBuffer::writeTextColor( DWORD color) { if (m_color == color) return; m_color = color; writeDWORD(mgColorCmd, color); }
void readNumberWithDebug(LauncherProperties * props, DWORD * dest, char * paramName) { writeMessageA(props, OUTPUT_LEVEL_DEBUG, 0, "Reading ", 0); writeMessageA(props, OUTPUT_LEVEL_DEBUG, 0, paramName, 0); writeMessageA(props, OUTPUT_LEVEL_DEBUG, 0, " : ", 0); readNumber(props, dest); if(!isOK(props)) { writeMessageA(props, OUTPUT_LEVEL_DEBUG, 0, "[ERROR] Can`t read number !!! Seems to be integrity error", 1); return; } writeDWORD(props, OUTPUT_LEVEL_DEBUG, 0, NULL, *dest, 1); return; }
// returns: ERROR_OK, ERROR_INPUTOUPUT, ERROR_INTEGRITY 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; } } }