void ComprDataIO::UnpWrite(byte *Addr,size_t Count) { #ifdef RARDLL RAROptions *Cmd=((Archive *)SrcFile)->GetRAROptions(); if (Cmd->DllOpMode!=RAR_SKIP) { if (Cmd->Callback!=NULL && Cmd->Callback(UCM_PROCESSDATA,Cmd->UserData,(LPARAM)Addr,Count)==-1) ErrHandler.Exit(RARX_USERBREAK); if (Cmd->ProcessDataProc!=NULL) { // Here we preserve ESP value. It is necessary for those developers, // who still define ProcessDataProc callback as "C" type function, // even though in year 2001 we announced in unrar.dll whatsnew.txt // that it will be PASCAL type (for compatibility with Visual Basic). #if defined(_MSC_VER) #ifndef _WIN_64 __asm mov ebx,esp #endif #elif defined(_WIN_ALL) && defined(__BORLANDC__) _EBX=_ESP; #endif int RetCode=Cmd->ProcessDataProc(Addr,(int)Count); // Restore ESP after ProcessDataProc with wrongly defined calling // convention broken it. #if defined(_MSC_VER) #ifndef _WIN_64 __asm mov esp,ebx #endif #elif defined(_WIN_ALL) && defined(__BORLANDC__) _ESP=_EBX; #endif if (RetCode==0) ErrHandler.Exit(RARX_USERBREAK); } } #endif // RARDLL UnpWrAddr=Addr; UnpWrSize=Count; if (UnpackToMemory) { if (Count <= UnpackToMemorySize) { memcpy(UnpackToMemoryAddr,Addr,Count); UnpackToMemoryAddr+=Count; UnpackToMemorySize-=Count; } } else if (!TestMode) DestFile->Write(Addr,Count); CurUnpWrite+=Count; if (!SkipUnpCRC) UnpHash.Update(Addr,Count); ShowUnpWrite(); Wait(); }
void ComprDataIO::UnpWrite(byte *Addr,uint Count) { #ifdef RARDLL RAROptions *Cmd=((Archive *)SrcFile)->GetRAROptions(); if (Cmd->DllOpMode!=RAR_SKIP) { if (Cmd->Callback!=NULL && Cmd->Callback(UCM_PROCESSDATA,Cmd->UserData,(LONG)Addr,Count)==-1) ErrHandler.Exit(USER_BREAK); if (Cmd->ProcessDataProc!=NULL) { //#ifdef _WIN_32 // _EBX=_ESP; //#endif int RetCode=Cmd->ProcessDataProc(Addr,Count); //#ifdef _WIN_32 // _ESP=_EBX; //#endif if (RetCode==0) ErrHandler.Exit(USER_BREAK); } } #endif UnpWrAddr=Addr; UnpWrSize=Count; if (UnpackToMemory) { if (Count <= UnpackToMemorySize) { memcpy(UnpackToMemoryAddr,Addr,Count); UnpackToMemoryAddr+=Count; UnpackToMemorySize-=Count; } } else if (!TestMode) DestFile->Write(Addr,Count); CurUnpWrite+=Count; if (!SkipUnpCRC) #ifndef SFX_MODULE if (((Archive *)SrcFile)->OldFormat) UnpFileCRC=OldCRC((ushort)UnpFileCRC,Addr,Count); else #endif UnpFileCRC=CRC(UnpFileCRC,Addr,Count); ShowUnpWrite(); Wait(); }
void ComprDataIO::UnpWrite(byte *Addr,uint Count) { #ifdef RARDLL RAROptions *Cmd=((Archive *)SrcFile)->GetRAROptions(); if (Cmd->DllOpMode!=RAR_SKIP) { if (Cmd->Callback!=NULL && Cmd->Callback(UCM_PROCESSDATA,Cmd->UserData,(LONG)Addr,Count)==-1) ErrHandler.Exit(USER_BREAK); if (Cmd->ProcessDataProc!=NULL) { #ifdef _WIN_32 _EBX=_ESP; #endif int RetCode=Cmd->ProcessDataProc(Addr,Count); #ifdef _WIN_32 _ESP=_EBX; #endif if (RetCode==0) ErrHandler.Exit(USER_BREAK); } } #endif UnpWrAddr=Addr; UnpWrSize=Count; if (UnpackToMemory) { while(UnpackToMemorySize < (int)Count) { hBufferEmpty->Broadcast(); while(!hBufferFilled->Wait(1)) { if (hQuit->Wait(1)) return; } } if (!hSeek->Wait(1)) // we are seeking { memcpy(UnpackToMemoryAddr,Addr,Count); UnpackToMemoryAddr+=Count; UnpackToMemorySize-=Count; } else return; } else if (!TestMode) DestFile->Write(Addr,Count); CurUnpWrite+=Count; if (!SkipUnpCRC) { #ifndef SFX_MODULE if (((Archive *)SrcFile)->OldFormat) UnpFileCRC=OldCRC((ushort)UnpFileCRC,Addr,Count); else #endif UnpFileCRC=CRC(UnpFileCRC,Addr,Count); } ShowUnpWrite(); Wait(); /*if (m_pDlgProgress) { m_pDlgProgress->ShowProgressBar(true); m_pDlgProgress->SetPercentage(int(float(CurUnpWrite)/float(((Archive*)SrcFile)->NewLhd.FullUnpSize)*100)); m_pDlgProgress->Progress(); if (m_pDlgProgress->IsCanceled()) bQuit = true; }*/ }