elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Variable de tamaño dinámico?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Variable de tamaño dinámico?  (Leído 2,197 veces)
huchoko

Desconectado Desconectado

Mensajes: 97


Ver Perfil WWW
Variable de tamaño dinámico?
« en: 5 Julio 2019, 05:24 am »

Código
  1. int fat32_open_file(uint8_t* filename, uint8_t* buff)
  2. {
  3. if (!hd_exists() && !filename)
  4. return 1;
  5. hd_read(start_of_root, FAT32_FILES_PER_DIRECTORY * sizeof(struct DirectoryEntry), (uint8_t*)&drce[0]);
  6.  
  7. for (int i = 0; i < FAT32_FILES_PER_DIRECTORY; ++i) {
  8. if (drce[i].file_name[0] == FAT32_NO_FILES)
  9. break;
  10. uint8_t* fatbuff = 0;
  11. uint8_t fil[12];
  12. fat2human(drce[i].file_name, fil);
  13. trimName(fil, 11);
  14. if (strcmp((char*)fil, (char*)filename) == 0) {
  15. uint8_t fcluster = ((uint32_t)drce[i].cluster_number_hi) << 16 | ((uint32_t)drce[i].cluster_number_lo);  
  16. int32_t ncluster = fcluster;
  17. int32_t file_size = drce[i].file_size;
  18.  
  19. kputs("\nFile content: \n");
  20.  
  21. /* 1 sector file (less than 512 bytes) */
  22. if (file_size < 512) {
  23. hd_read(fcluster, 512, buff);
  24. buff[file_size] = '\0';
  25. //kputs("%s", (char*)buff);
  26. }
  27.  
  28. while (file_size > 0) {
  29. uint32_t fsect = start_of_data + bpb.sectors_per_cluster * (ncluster - 2);
  30. uint32_t sector_offset = 0;
  31. for (; file_size > 0; file_size -= 512) {
  32. hd_read(fsect + sector_offset, 512, buff);
  33. buff[file_size > 512 ? 512 : file_size] = '\0';
  34. //kputs("%s", (char*)buff);
  35. if (++sector_offset > bpb.sectors_per_cluster)
  36. break;
  37. }
  38. uint32_t fsectcurrentcl = ncluster / (512 / sizeof(uint32_t));
  39.  
  40. hd_read(fat_start + fsectcurrentcl, 512, fatbuff);
  41. uint32_t foffsectcurrentcl = ncluster % (512 / sizeof (uint32_t));
  42. ncluster = ((uint32_t*)&fatbuff)[foffsectcurrentcl] & 0x0FFFFFFF;
  43. }
  44. return 0;
  45. }
  46. }
  47. kputs("\nFile %s not found\n", filename);
  48. return 1;
  49. }
Funciona, pero hay un problema. Debo darle un tamaño al buffer:
Código
  1. uint8_t fileb[1024];
  2. fat32_open_file(buff, fileb);
  3.  
La cosa es que no se puede saber el tamaño del buffer pasado por la función, puede ser de 512, 2048, etc.
Hay una forma de hacer que fileb sea dinámico?


« Última modificación: 5 Julio 2019, 17:00 pm por huchoko » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Variable de tamaño dinámico?
« Respuesta #1 en: 5 Julio 2019, 20:57 pm »

Entiendo que trabajas a nivel kernel por lo que deberías usar lo que te explican aquí:
https://stackoverflow.com/questions/2888421/malloc-in-kernel


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Variable de tamaño dinámico?
« Respuesta #2 en: 5 Julio 2019, 21:31 pm »

Funciona, pero hay un problema. Debo darle un tamaño al buffer:

¿No sera demasiado copy/paste? Cada vez que usa buff es solo para  leer el tamaño de un sector de 512 bytes. fatbuff es un puntero nulo asi que asumiendo que no haya otros errores esto solo puede funcionar con archivos de menos de 512 bytes.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
huchoko

Desconectado Desconectado

Mensajes: 97


Ver Perfil WWW
Re: Variable de tamaño dinámico?
« Respuesta #3 en: 6 Julio 2019, 03:56 am »

¿No sera demasiado copy/paste? Cada vez que usa buff es solo para  leer el tamaño de un sector de 512 bytes. fatbuff es un puntero nulo asi que asumiendo que no haya otros errores esto solo puede funcionar con archivos de menos de 512 bytes.
Ya sabía que solo se iba a leer 512 bytes (y ya lo he arreglado). Lo que aún no logro hacer funcionar es lo que comento en el título del hilo. Tal como me respondió MAFUS con un malloc es fácil, pero podría ser que el archivo:
a) Sea más grande de lo que hemos reservado en memoria para el buffer
b) Sea más pequeño de lo que hemos reservado, gastando memoria (solucionable con realloc?)
« Última modificación: 6 Julio 2019, 06:16 am por huchoko » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Variable de tamaño dinámico?
« Respuesta #4 en: 6 Julio 2019, 08:19 am »

Ya sabía que solo se iba a leer 512 bytes (y ya lo he arreglado). Lo que aún no logro hacer funcionar es lo que comento en el título del hilo. Tal como me respondió MAFUS con un malloc es fácil, pero podría ser que el archivo:
a) Sea más grande de lo que hemos reservado en memoria para el buffer
b) Sea más pequeño de lo que hemos reservado, gastando memoria (solucionable con realloc?)

El problema que planteas ahora es muy facil de solucionar, la memoria la reserva fat32_open_file (doble puntero, referencia, valor de retorno, etc.) o de alguna manera le pasa al llamador el tamaño del archivo (idem) PERO falla el diseño por todas partes. Una funcion que se llama open no deberia estar leyendo un archivo, ni deberias reservar memoria para todo el archivo asi como asi (podria ocupar varios GB por ejemplo). Ni deberias tratar de terminar un buffer con un 0 terminador como si fuera una cadena ... y si esa parte si es una prueba o un codigo que no sera de produccion mejor abstraenos del mismo, solo consigue confundirnos y hacernos perder el tiempo mientras tratamos de ayudarte.

¿Como funciona un S.O. de verdad? Devuelve una referencia, un HANDLE, para hacer esto bien deberias asociar el archivo a una estructura donde tuvieras la informacion necesaria para poder leer (y escribir, retroceder o avanzar dentro del archivo, retornar el tamaño del mismo, etc.) y otra funcion de lectura separada, posteriormente el llamador y (no el S.O.) decide cuanto y como leer.

PD. Si todavia no conseguiste depurar tu codigo ya es imperativo que lo logres, por ejemplo me equivoque antes, el codigo tiene tantos errores que me perdi, fatbuff se intentara usar siempre que encuentre el archivo asi que esto no funciona bien jamas y es algo que podrias ver al depurarlo.
« Última modificación: 6 Julio 2019, 16:12 pm por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines