Beispiel #1
0
t_printf_params		*create_printf_params(char *str)
{
  t_printf_params	*params;
  int			from;
  int			i;
  char			*tmp;

  params = xmalloc(sizeof(t_printf_params));
  init(params, &from, &i);
  while (str[i] != '\0')
    if (str[i++] == '.')
    {
      tmp = my_substr(str, from, i - 2);
      params->width = my_getnbr(tmp);
      free(tmp);
      from = i;
    }
  tmp = my_substr(str, from, i - 1);
  if (params->width != 0 || str[0] == '.')
    params->prec = my_getnbr(tmp);
  else
    params->width = my_getnbr(tmp);
  free(tmp);
  free(str);
  return (params);
}
Beispiel #2
0
SVFIP VirtualFAT::InsertItem(const char* Dir, SVFIP Item)
{
    SVFIP D;
    SVFIP T;
    SVFIP I;
    char *p, *s;

    D = Root;

    p = my_strdup(Dir);    

    char *fn = ExtractName(Dir);
    while (TRUE){        

        char * t = ExtractRoot(p);
        
        T = GetDir(D, t);

        if (!T) {
            I = (SVFIP)my_malloc(sizeof(SVFI));
            I->FileName      = my_strdup(t);
            I->Description   = my_strdup("<dir>");
            I->Plugin        = my_strdup("");
            I->IsDirectory   = TRUE;
            I->Fmt           = -1;
            I->IsExtension   = FALSE;
            I->Offset        = 0;
            I->LevelUp       = D;
            I->PackedSize    = 0;
            I->UnpackedSize  = 0;
            I->UserData.Data = NULL;
            I->UserData.Size = 0;

            D = InsertItem(D, I);            
        } else D = T;

        s = my_substr(p, lstrlen(t)+1, lstrlen(p));                
        
        if (lstrlen(s)==0){
            my_free(t);
            my_free(p);
            my_free(s);
            my_free(fn);
            
            if (Item->Fmt == FMT_SPEC)
                return D;
            D = InsertItem(D, Item);
            return D;
        }
        my_free(p);
        my_free(t);
        p = s;        
    }
    my_free(p);
    my_free(fn);

    return NULL;
}
Beispiel #3
0
char	*trim_quote(char *str)
{
  int	size;

  size = my_strlen(str) - 1;
  if ((str[0] == '\'' && str[size] == '\'') ||
    (str[0] == '"' && str[size] == '"'))
    return (my_substr(str, 1, size - 1));
  return (my_strdup(str));
}
Beispiel #4
0
char		*get_label(char *line)
{
  int		index_start;
  int		index_end;
  char		*label;

  index_start = -1;
  index_end = get_nindex_of(line, ':', 1);
  label = my_substr(line, index_start, index_end);
  return (label);
}
Beispiel #5
0
char		*get_comment(char *line)
{
  int		index_start;
  int		index_end;
  char		*comment;

  line = epur_str(line);
  index_start = get_nindex_of(line, '"', 1);
  index_end = get_nindex_of(line, '"', 2);
  comment = my_substr(line, index_start, index_end);
  return (comment);
}
Beispiel #6
0
char		*get_name(char *line)
{
  int		index_start;
  int		index_end;
  char		*name;

  line = epur_str(line);
  index_start = get_nindex_of(line, '"', 1);
  index_end = get_nindex_of(line, '"', 2);
  name = my_substr(line, index_start, index_end);
  return (name);
}
Beispiel #7
0
SVFIP VirtualFAT::GetPath(SVFIP Item, char* PathName)
{
    SVFIP D;
    char *p, *s;

    if (!Item) D = Root;
    else D = Item;

    if (lstrlen(PathName)==0) return Root;

    p = my_strdup(PathName);
    char *fn = ExtractName(PathName);
    while (TRUE){
        char * t = ExtractRoot(p);
        
        D = GetDir(D, t);
        
        if (!D) {
            my_free(t);
            my_free(p);
            my_free(fn);
            return NULL;
        }
        s = my_substr(p, lstrlen(t)+1, lstrlen(p));                
        if (lstrlen(s)==0) {        
            my_free(t);
            my_free(p);
            my_free(s);
            my_free(fn);
            return D;
        }        
        my_free(p);
        my_free(t);        
        p = s;
    }
    my_free(p);
    my_free(fn);
    
    return NULL;
}
Beispiel #8
0
int			do_aff(char* str, int pct_i, int type_i, va_list ap)
{
  int			i;
  t_printf_params	*params;
  int			size;

  params = create_printf_params(my_substr(str, pct_i + 1, type_i - 1));
  i = 0;
  size = -1;
  while (my_printf_funct[i].type != '\0' && size == -1)
  {
    if (my_printf_funct[i].type == str[type_i])
      size = (my_printf_funct[i].funct)(ap, params);
    ++i;
  }
  free(params);
  if (my_printf_funct[i].type == '\0' && size == -1)
  {
    write(1, "%", 1);
    return (1);
  }
  return (size);
}
Beispiel #9
0
int AlgebraicParser::operator()(const string &str, double *val){

 // coding of arythmetical operations
  const int extOP_PLUS=1;
  const int extOP_MINUS=-1;
  const int extOP_MUL=2;
  const int extOP_DIV=-2;

  /* вначале разбиваем строку на подстроки, связанные + и -, 
  поскольку эти операции обладают меньшим приоритетом.
  потом разбиваем подстроки, связанные * и /.
  Данная функция разбивает строку на две подстроки.
  Дальнейшее разбитие осуществляется с помощью рекурсивного вызова этой же функции.
  */

  if (str.length()==0)
    return -2;

  int direct=0; // 1 - правое слагаемое есть число, 0 - правое слагаемое есть выражение

  //ищем с конца первый символ + или - вне скобок ()
  int op=extOP_MINUS; // кодирует арифметическое действие (возможные значения перечислены в разделе define)
  int c1=find_symbol(str,'-');
  int c2=find_symbol(str,'+');
  if (c1<-1 || c2<-1) return -2; // скобки в строке расставлены некорректно

  if(c1<0 && c2<0){ // none of +/- found
    //ищем с конца первый символ * или / вне скобок ()
    op=extOP_MUL;
    c1=find_symbol(str,'*');
    c2=find_symbol(str,'/');
    if (c1<-1 || c2<-1) return -2; // скобки в строке расставлены некорректно
    direct=1; // предполагаем, что правое слагаемое есть число
  }

  if(c2>c1){ // первой с конца встречается операция, противоположная изначально заданной (+ или / )
    op=-op;
    c1=c2;
  }
  double val1=0, val2=0; // в эти переменные будут записаны значения для первого и второго слагаемого

  if (c1<0 && c2<0) { // ни одного символа + - * / в строке не встречено
    if(str[0]=='(' && str[str.length()-1]==')') { // строка есть выражение в скобках (...)
      string token1=SUBSTR(str, 1, (int)str.length()-2); // смотрим, что внутри скобок
      return operator()(token1, val); // считаем это и возвращаем
    }
    // строка есть просто число. в этом случае val1 будет единицей, val2 будет этим числом,
    // а действие будет умножением (в результате мы получим 1*val2=val2)
    val1=1;
  }
  else {
    string token1=SUBSTR(str, 0, c1);
    trim(token1);
    if(token1.length()==0){ // длина подстроки перед символом равна нулю
      if(op==extOP_MINUS)val1=0.; // унарный минус (например, -5)
      else return -1; // ошибка
    }
    else{
      if(operator()(token1,&val1)<0) // считаем val1
        return -1;
    }
  }

//  string token2=str.substr(c1+1, str.length()-(c1+1));
  string token2=my_substr(str, c1+1, (int)str.length()-(c1+1));
  if (token2.length()==0)
    return -1; // ошибка
  trim(token2);
  if(token2[0]=='(' && token2[token2.length()-1]==')'){ // правое слагаемое есть выражение в скобках, а не число
    direct=0;
  }
  if(direct){ // правое выражение есть непосредственно число
    if(atof_map(token2, &val2)<1)return -1;
  }
  else{
    if(operator()(token2,&val2)<0)
      return -1;
  }
  // мы посчитали два слагаемых val1 и val2 и производим арифметическую операцию  
  switch(op){
    case extOP_PLUS:
      *val=val1+val2;
    break;
    case extOP_MINUS:
      *val=val1-val2;
    break;
    case extOP_DIV:
      *val=val1/val2;
    break;
    case extOP_MUL:
      *val=val1*val2;
    break;
  }
  return 1;
}
Beispiel #10
0
long PackCheckSH(const char * FileName, PUCHAR BaseString, long readed, long &HeadOffset, long &SomeOffset, long &FileSize, long &FileOffset, struct RIP_FILE_INFO **finfo, long &FilesNumber, long WorkFileSize, struct RIP_SERVICE_FUNC *func, struct RIP_FLAGS *flags)
{       
#pragma pack(1)
    struct SHInfo{
        char FileName[24];
        long FileOffset;
        long FileSize;
    }SH;
#pragma pack(8)

    long rd, FOffset, nFiles, z;
    bool WasError = false;
    int errorfrom;
        
    RIP_FILE_INFO           * fi;

    FOffset = WorkFileSize-8;

    rd =  func->ReadFromFile(FileName, FOffset, &nFiles, 4);
    if (rd < 4) return -1;
    
    if (nFiles <= 0) return -1;

    FOffset += rd;

    rd =  func->ReadFromFile(FileName, FOffset, &z, 4);
    if (rd < 4) return -1;

    if ((z>WorkFileSize)||
        (z<=0)) return -1;

    FOffset = WorkFileSize-z;

    fi = (RIP_FILE_INFO*)my_malloc(sizeof(RIP_FILE_INFO)*nFiles);
    if (fi == NULL) return -1;
    *finfo = fi;    

    FilesNumber = nFiles;    
    
    for (int i = 0; i<FilesNumber; i++){    
        rd =  func->ReadFromFile(FileName, FOffset, &SH, sizeof SH);
        if (rd < sizeof SH)  {
            WasError = true;
            errorfrom = i;
            break;
        }
        
        FOffset += rd;
        
        memset(&fi[i], 0, sizeof(RIP_FILE_INFO));
        
        fi[i].StartOffset = WorkFileSize-SH.FileOffset-z;
        fi[i].FileSize    = SH.FileSize;
        if (fi[i].StartOffset+fi[i].FileSize>WorkFileSize) {
            WasError = true;
            errorfrom = i;
            break;
        }

        fi[i].FullFileName = my_substr(SH.FileName,0,24,1);          
        fi[i].FullFileName[24]=0;
        fi[i].Description = my_strdup("");                          
    }              

    if (WasError){
        for (int j=0; j<errorfrom; j++){
            my_free(fi[j].FullFileName);                
            my_free(fi[j].Description);        
        }
        my_free(fi);
        fi = NULL;
        return -1;
    }
    
    FileOffset = 0;
    FileSize = WorkFileSize;
    return WorkFileSize;
}
Beispiel #11
0
int MrRipper::GetFiles(struct PluginPanelItem *PanelItem, int ItemsNumber, int Move, char *DestPath, int OpMode)
{
    TSaveScreen SS;
    DWORD StartTime=GetTickCount();
    BOOL WaitMessage=FALSE;
    double Progress1, Progress2;
    long FullSize,CurSize, ProcessedBytes;
    int Owervrite = 0;
    char MyDestPath[MAX_PATH];
    char MyDestFile[MAX_PATH];

    if (!OpMode & OPM_SILENT){        
        if (!DestDirPrompt(DestPath)) return -2;        
    }

        if ((strlen(DestPath)==3)&&
                (DestPath[1]==':')&&
                (DestPath[2]=='\\')) DestPath[2] = 0;

    GetCurrentDirectory(MAX_PATH, MyDestPath);
    if (!SetCurrentDirectory(DestPath)) return FALSE;
    SetCurrentDirectory(MyDestPath);
    
    FormatFinder FF(PluginPath);        
    for (int i = 0; i<FF.GetFormatCount(); i++)             
        for (int j = 0; j<FF.GetnKnownFormats(i); j++)
            FF.SetActiveOpt(i, j, GetRegKey(HKEY_CURRENT_USER,"",FF.GetRegPath(i, j), 1));

    MakeCopyList(PanelItem, ItemsNumber);

    int f1, f2;
    int readed, pos, endpos, getret;
    
    if (!bPluginManager){
        FullSize = 0;
    
        for (int I = 0; I < copyfiles.size(); I++)
            FullSize += copyfiles[I].FileSize;
                        
        ProcessedBytes = 0;                                                     
    
        for (I = 0; I < copyfiles.size(); I++){
            if (copyfiles[I].FileName[strlen(copyfiles[I].FileName)-1]=='\\'){
                char *c = my_substr(copyfiles[I].FileName, 0, strlen(copyfiles[I].FileName)-1);
                FSF.sprintf(MyDestPath, "%s\\%s", DestPath, c);
                my_free(c);
                CreateDirectory(MyDestPath, NULL);            
            } else {    
                char *d = ExtractPath(copyfiles[I].FileName);
                if (strlen(d)>0) FSF.sprintf(MyDestPath, "%s\\%s", DestPath, d); 
                else strcpy(MyDestPath, DestPath);
                my_free(d);
            
                d = ExtractName(copyfiles[I].FileName);
                FSF.sprintf(MyDestFile, "%s", d);
                my_free(d);

                char c[MAX_PATH];
                FSF.sprintf(c, "%s\\%s", MyDestPath, MyDestFile);

                f2 = _open(c, _O_RDONLY|_O_BINARY);
                if (f2!=-1) {
                    _close(f2);
                    if (Owervrite==3) continue;
                    if (Owervrite == 0||Owervrite == 1)
                    if (!OpMode & OPM_SILENT) Owervrite = OverwritePrompt(MyDestFile);
                    if (Owervrite==-1) break;
                    if (Owervrite==3||Owervrite==1) continue;
                }   
    
                if (copyfiles[I].Fmt != FMT_DUMMY)
                    if (FF.GetCanGetFile(copyfiles[I].Fmt, copyfiles[I].Plugin)&&ConvView){
                        getret = FF.GetFile(copyfiles[I].Plugin, copyfiles[I].Fmt, RipFileName, MyDestFile, MyDestPath, copyfiles[I].StartOffset, copyfiles[I].FileSize, copyfiles[I].UnpSize, OpMode & OPM_SILENT, copyfiles[I].UserData.Data);
                        if (getret == 1){
                            ProcessedBytes += copyfiles[I].FileSize;
                            WaitMessage=FALSE;
                            if (!OpMode & OPM_SILENT){                                
                                if (GetTickCount()-StartTime>500){
                                    if (CheckForKey(VK_ESCAPE)) break;
                                    Progress1 = 100.0;
                                    Progress2 = ProcessedBytes; Progress2 *= 100; Progress2 /= FullSize;
                                    char FileMsg[100], ProgressMsg1[100], ProgressMsg2[100];
                                    FSF.sprintf(FileMsg,GetMsg(MExtracting), MyDestFile);
                                    FSF.sprintf(ProgressMsg1,GetMsg(MExtr1), Progress1);
                                    FSF.sprintf(ProgressMsg2,GetMsg(MExtr2), Progress2);                                                                                        
                                    const char *MsgItems[]={GetMsg(MExtraction),FileMsg, ProgressMsg1, ProgressMsg2};
                                    Info.Message(Info.ModuleNumber,WaitMessage ? FMSG_LEFTALIGN|FMSG_KEEPBACKGROUND:FMSG_LEFTALIGN,NULL,MsgItems,sizeof(MsgItems)/sizeof(MsgItems[0]),0);
                                    WaitMessage=TRUE;
                                }       
                            }
                            continue;
                        }
                        if (getret == 2){
                            if (CheckForKey(VK_ESCAPE)) break;
                            continue;
                        }
                    }
            
                FSF.sprintf(c, "%s\\%s", MyDestPath, MyDestFile);
    
                f1 = _open(RipFileName, _O_RDONLY|_O_BINARY);
                _lseek(f1,copyfiles[I].StartOffset,SEEK_SET);                                                     
            
                f2 = _open(c, _O_CREAT|_O_WRONLY|_O_BINARY);
                                
                endpos = copyfiles[I].StartOffset+copyfiles[I].FileSize;
                CurSize = copyfiles[I].FileSize;
                pos = _tell(f1);

                while (pos<endpos){                                       
                    if (!OpMode & OPM_SILENT){                    
                        if (GetTickCount()-StartTime>500){
                            if (CheckForKey(VK_ESCAPE)) break;
                            Progress1 = (pos-copyfiles[I].StartOffset); Progress1 *= 100; Progress1 /= copyfiles[I].FileSize;
                            Progress2 = ProcessedBytes; Progress2 *= 100; Progress2 /= FullSize;
                            char FileMsg[100], ProgressMsg1[100], ProgressMsg2[100];
                            FSF.sprintf(FileMsg,GetMsg(MExtracting), MyDestFile);
                            FSF.sprintf(ProgressMsg1,GetMsg(MExtr1), Progress1);
                            FSF.sprintf(ProgressMsg2,GetMsg(MExtr2), Progress2);                                                                                        
                            const char *MsgItems[]={GetMsg(MExtraction),FileMsg, ProgressMsg1, ProgressMsg2};
                            Info.Message(Info.ModuleNumber,WaitMessage ? FMSG_LEFTALIGN|FMSG_KEEPBACKGROUND:FMSG_LEFTALIGN,NULL,MsgItems,sizeof(MsgItems)/sizeof(MsgItems[0]),0);
                            WaitMessage=TRUE;
                        }       
                    }
                    readed = _read(f1, buf, BUF_SIZE);                                       
                    pos = _tell(f1);                                                                                
                    if (pos > endpos) readed = readed - (pos - endpos);
                    _write(f2, buf, readed);
                    ProcessedBytes += readed;
                    pos = _tell(f1);    
                    WaitMessage=FALSE;
                }            
                _close(f2);
                _close(f1);            
                SetFileAttributes(c, FILE_ATTRIBUTE_ARCHIVE);            
                if (!OpMode & OPM_SILENT) if (CheckForKey(VK_ESCAPE))  break;
            }
        }
        Free_copyfiles();
        return TRUE;
    } else { //For plugin manager    
        ADDPLUGININFO *PI;
        for (int I = 0; I < copyfiles.size(); I++){
            if (copyfiles[I].FileName[strlen(copyfiles[I].FileName)-1]=='\\'){
                char *c = my_substr(copyfiles[I].FileName, 0, strlen(copyfiles[I].FileName)-1);
                FSF.sprintf(MyDestPath, "%s\\%s", DestPath, c);
                my_free(c);
                CreateDirectory(MyDestPath, NULL);            
            } else {    
                char *d = ExtractPath(copyfiles[I].FileName);
                if (strlen(d)>0) FSF.sprintf(MyDestPath, "%s\\%s", DestPath, d); 
                else strcpy(MyDestPath, DestPath);
                my_free(d);
            
                d = ExtractName(copyfiles[I].FileName);
                FSF.sprintf(MyDestFile, "%s", d);
                my_free(d);

                char c[MAX_PATH];
                FSF.sprintf(c, "%s\\%s", MyDestPath, MyDestFile);

                f2 = _open(c, _O_RDONLY|_O_BINARY);
                if (f2!=-1) {
                    _close(f2);
                    if (Owervrite==3) continue;
                    if (Owervrite == 0||Owervrite == 1)
                    if (!OpMode & OPM_SILENT) Owervrite = OverwritePrompt(MyDestFile);
                    if (Owervrite==-1) break;
                    if (Owervrite==3||Owervrite==1) continue;
                }                   
            
                FSF.sprintf(c, "%s\\%s", MyDestPath, MyDestFile);                
            
                f2 = _open(c, _O_CREAT|_O_WRONLY|_O_BINARY);                                
                
                PI = (ADDPLUGININFO*)copyfiles[I].UserData.Data;

                FSF.sprintf((char*)buf, GetMsg(MInfoOptString), copyfiles[I].FileName);
                _write(f2, buf, lstrlen((char*)buf)+1);
                _write(f2, "\xD\xA\xD\xA", 4);

                FSF.sprintf((char*)buf, GetMsg(MInfoVer), copyfiles[I].Description);
                _write(f2, buf, lstrlen((char*)buf)+1);
                _write(f2, "\xD\xA", 2);
                
                char v[30];
                Ver2Char(PI->RipVer, v);

                FSF.sprintf((char*)buf, GetMsg(MInfoRipVer), v);
                _write(f2, buf, lstrlen((char*)buf)+1);                
                _write(f2, "\xD\xA\xD\xA", 4);

                FSF.sprintf((char*)buf, GetMsg(MInfoCopyright), PI->Copy);
                _write(f2, buf, lstrlen((char*)buf)+1);
                _write(f2, "\xD\xA", 2);

                FSF.sprintf((char*)buf, GetMsg(MInfoPath), PI->FilePath);
                _write(f2, buf, lstrlen((char*)buf)+1);
                _write(f2, "\xD\xA", 2);

                char *types[8] = {GetMsg(MInfoTypeGraph), 
                                  GetMsg(MInfoTypeVideo), 
                                  GetMsg(MInfoTypeSound),
                                  GetMsg(MInfoTypePack),
                                  GetMsg(MInfoTypeOther),
                                  GetMsg(MInfoTypeMusic),
                                  GetMsg(MInfoTypeText),
                                  GetMsg(MInfoTypeExe)};

                FSF.sprintf((char*)buf, GetMsg(MInfoType), types[PI->Type]);
                _write(f2, buf, lstrlen((char*)buf)+1);                

                _close(f2);
                
                SetFileAttributes(c, FILE_ATTRIBUTE_ARCHIVE);            
                if (!OpMode & OPM_SILENT) if (CheckForKey(VK_ESCAPE))  break;
            }
        }
        Free_copyfiles();

        //This for refuse reset selection
        if (!OpMode&OPM_SILENT) return -1;
        else return TRUE;
    }
    Free_copyfiles();
    return TRUE;
}
Beispiel #12
0
int MrRipper::GetFindData(PluginPanelItem **pPanelItem,int *pItemsNumber,int OpMode)
{       
    TSaveScreen SS;             
    *pPanelItem=NULL;
    *pItemsNumber=0;  
    
    if (bPluginManager) PluginManager(OpMode);
    else FileRipper(OpMode);

    PluginPanelItem *NewPanelItem=(PluginPanelItem *)my_malloc(sizeof(PluginPanelItem)*shownfiles.size());
    *pPanelItem=NewPanelItem;
    if (NewPanelItem==NULL) return(FALSE);

    if (!bPluginManager){
        int CurItemPos=0;
        for (int Z=0; Z < shownfiles.size(); Z++){
            memset(&NewPanelItem[CurItemPos],0,sizeof(PluginPanelItem));
            NewPanelItem[CurItemPos].CustomColumnData=(char**)my_malloc(sizeof(char*));
            NewPanelItem[CurItemPos].CustomColumnNumber = 1;
            char deb[1000];

            if (shownfiles[Z].IsDirectory){
                NewPanelItem[CurItemPos].FindData.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
                
                lstrcpy(NewPanelItem[CurItemPos].FindData.cFileName, shownfiles[Z].FileName);
                
                NewPanelItem[CurItemPos].PackSize = 0;
                NewPanelItem[CurItemPos].FindData.nFileSizeLow = 0;

                NewPanelItem[CurItemPos].CustomColumnData[0]=my_strdup("<dir>");
            } else {
                NewPanelItem[CurItemPos].FindData.dwFileAttributes = FILE_ATTRIBUTE_ARCHIVE;
         
                FSF.sprintf(deb, "%X+%X=%X", shownfiles[Z].StartOffset, shownfiles[Z].FileSize, shownfiles[Z].StartOffset+shownfiles[Z].FileSize);
                NewPanelItem[CurItemPos].CustomColumnData[0]=my_strdup(deb);

                NewPanelItem[CurItemPos].PackSize = shownfiles[Z].StartOffset;
                
                NewPanelItem[CurItemPos].FindData.nFileSizeLow = shownfiles[Z].FileSize;
        
                lstrcpy(NewPanelItem[CurItemPos].FindData.cFileName,shownfiles[Z].FileName);

                if (shownfiles[Z].UserData.Size > 0){
                    NewPanelItem[CurItemPos].Flags |= PPIF_USERDATA;
                    NewPanelItem[CurItemPos].UserData = (ULONG)&shownfiles[Z].UserData;
                }
            }

            NewPanelItem[CurItemPos].Description= my_strdup(shownfiles[Z].Description);
        
            NewPanelItem[CurItemPos].Owner = NULL;
            CurItemPos++;
        }
    } else {
        ADDPLUGININFO *PI;
        int CurItemPos=0;        
        int u = Char2Ver(RIPVER);
        for (int Z=0; Z < shownfiles.size(); Z++){
            memset(&NewPanelItem[CurItemPos],0,sizeof(PluginPanelItem));
            NewPanelItem[CurItemPos].CustomColumnData=(char**)my_malloc(sizeof(char*));
            NewPanelItem[CurItemPos].CustomColumnNumber = 1;
            char deb[1000];

            if (shownfiles[Z].IsDirectory){
                NewPanelItem[CurItemPos].FindData.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;

                char *c = my_substr(shownfiles[Z].FileName, 0, strlen(shownfiles[Z].FileName)-1);
                strcpy(NewPanelItem[CurItemPos].FindData.cFileName, c);
                my_free(c);

                NewPanelItem[CurItemPos].PackSize = 0;
                NewPanelItem[CurItemPos].FindData.nFileSizeLow = 0;

                NewPanelItem[CurItemPos].CustomColumnData[0]=my_strdup("<dir>");
            } else {
                PI = (ADDPLUGININFO*)shownfiles[Z].UserData.Data;
                
                if (PI->RipVer <= u)
                    NewPanelItem[CurItemPos].FindData.dwFileAttributes = FILE_ATTRIBUTE_ARCHIVE;
                else 
                    NewPanelItem[CurItemPos].FindData.dwFileAttributes = FILE_ATTRIBUTE_HIDDEN;
                
                NewPanelItem[CurItemPos].Flags |= PPIF_USERDATA;
                NewPanelItem[CurItemPos].UserData = (ULONG)&shownfiles[Z].UserData;
                
                NewPanelItem[CurItemPos].PackSize = shownfiles[Z].StartOffset;
         
                FSF.sprintf(deb, "%X+%X=%X", shownfiles[Z].StartOffset, shownfiles[Z].FileSize, shownfiles[Z].StartOffset+shownfiles[Z].FileSize);
                NewPanelItem[CurItemPos].CustomColumnData[0]=my_strdup(deb);

                
                
                NewPanelItem[CurItemPos].FindData.nFileSizeLow = shownfiles[Z].FileSize;
        
                strcpy(NewPanelItem[CurItemPos].FindData.cFileName,shownfiles[Z].FileName);
            }

            NewPanelItem[CurItemPos].Description= my_strdup(shownfiles[Z].Description);
        
            NewPanelItem[CurItemPos].Owner = NULL;
            CurItemPos++;
        }
    }
    *pItemsNumber= shownfiles.size();   

    return(TRUE);
}