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

 

 


Tema destacado:


  Mostrar Temas
Páginas: [1] 2 3 4
1  Programación / Programación C/C++ / 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?
2  Programación / Programación C/C++ / Probar si varios bits están "seteados" en: 15 Junio 2019, 07:17 am
Buenas, tal cual en el título, nececito probar si varios bits de una variable estan "seteados" osea valen 1 (como saben bit 0 o 1).
Puedo comprobar un solo bit con:
Código
  1. if (variableacomprobar & indexdelbit) {
  2.    /* etc... */
  3. }
  4.  
Pero como lo hago para varios a la vez?
Por ejemplo, tengo una varible con dos bits que quiero comprobar a la vez:
Bits 7 y 6: quiero comprobar si el uno (bit 7) y el cero (bit 6) valen 1 y viceversa. Osea:
Código:
|15...|7|6|5|4|3|2|1|0|
       | |
       1 0
     Ó
       0 1
Espero haberme explicado bien, cualquier confusión preguntenme por aclaración. :)
3  Programación / Programación C/C++ / [C] Tratando de crear array de strings en: 8 Junio 2019, 20:54 pm
Buenas, he estado tratando de crear un array de strings, para luego leer todas sus strings.
Código
  1. /* Reservamos 16 elementos de string */
  2. char* file_names_in_dir[16];
  3. for (int i = 0; i < FAT32_FILES_PER_DIRECTORY; ++i) {
  4.        ...
  5. if (drce[i].file_name[0] == 0x00)
  6. break;
  7. file_names_in_dir[i] = drce[i].file_name;
  8. ++files_in_directory;
  9. }
  10. ...
  11. printf("%s", file_names_in_dir[0]);
  12. ...
  13.  
El tema es que funciona, pero luego de imprimir la string correctamente le sigue basura.
por ejemplo, file_names_in_dir[0] es "HELLO TXT", pero luego la string sigue, pero con basura.
Alguna idea? Gracias.
4  Programación / Programación General / Bug en GDB? en: 3 Junio 2019, 06:12 am
Buenas. Érase un día normal y corriente, yo programando y buscando bugs con mi que creía fiel debugger GDB. El tema es que de la nada los breakpoints dejaron de funcionar, asi por si nada, sin haber hecho ninguna cosa rara, obiamente haciendo el debugger inútil  ;-)
Estoy haciendo una sesión remota; (target remote localhost:1234), luego cargé los símbolos (symbol-file foo.elf)
y luego el breakpoint (b syscall.c:27).
Pero aparece: No line 27 in file "syscall.c". y luego Make breakpoint pending on future shared library load? (y or [n]). Siendo que el archivo syscall.c y la línea 27 existen.
Le doy a Y, y nada, de por sí por que no sirve, y luego N, y aun así nada. El breakpoint nunca existió.

La versión de mi debugger es GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git.
Un bug? Alguna solución? Estoy desesperado sin mi debugger :S
Saludos
PD: GDB y sesión remota son de la misma arquitectura (x86_64)
5  Programación / Programación C/C++ / Implementación de printf no termina con null las cadenas en: 6 Abril 2019, 15:24 pm
Buenas, he hecho una implementación de printf, sin usar vsnprintf (por que no puedo).
Funciona bien, pero si trato de formatear un número hexadecimal y aveces cadenas, se descontrola todo, por lo que pienso que se me está colando un terminador nulo '\0' .
Ejemplo:
Código
  1. kputs("r8: %x    r9: %x    r10: %x", r->r8, r->r9, r->r10);
Salida:
Código:
r8: b8000└
Sólo me imprime r8  y de ahí el valor en hexadecimal, pero los demás los ignora y no imprime r9 ni r0.
Nótese el carácter "└" el cual no es esperado.
Código
  1. int kputs(const char *fmt, ...) {
  2. /* Hacer nada si la cadena esta vacia. */
  3. if (!fmt)
  4. return 0;
  5. char buffer[1024] = {0};
  6. va_list args;
  7.  
  8. size_t cout;
  9. unsigned int* charc;
  10. va_start(args, fmt);
  11.  
  12. for (cout = 0; cout < strlen(fmt); ++cout) {
  13. switch (fmt[cout]) {
  14. case '%':
  15. switch (fmt[cout + 1]) {
  16. case 'c':
  17. charc = va_arg(args, unsigned int);
  18. putch(charc);
  19. ++cout;
  20. break;
  21. case 's':
  22. charc = (int*) (va_arg(args, unsigned int));
  23. strcpy(buffer, (const char*) charc);
  24. print_string(buffer);
  25. ++cout;
  26. break;
  27. case 'i':
  28. charc = va_arg(args, int);
  29. itoa(charc, buffer, 10);
  30. print_string(buffer);
  31. ++cout;
  32. break;
  33. case 'X':
  34. case 'x':
  35. charc = va_arg(args, int);
  36. itoa((unsigned)charc, buffer, 16);
  37. print_string(buffer);
  38. ++cout;
  39. case '%':
  40. putch("%");
  41. ++cout;
  42.  
  43. default:
  44. va_end(args);
  45. return 1;
  46. }
  47. break;
  48. default:
  49. putch(fmt[cout]);
  50. break;
  51. }
  52. }
  53. va_end(args);
  54. return cout;
  55. }
  56.  
Las funciones itoa no creo que sean el problema, por que mi implementación no tiene problemas para imprimir enteros. (excepto que se desborda con un número muy grande, eso se arregla fácil)
6  Sistemas Operativos / GNU/Linux / Borrar archivos con una extensión común recursivamente en: 4 Abril 2019, 04:23 am
Pues digamos que dentro de una carpeta tengo más carpetas, de las cuales hay aún más carpetas. Cómo puedo borrar archivos de una misma extensión recursivamente en todas las carpetas que estén dentro de la carpeta principal?
Se que puedo usar rm -rf *.o, pero tengo miedo de dispararme el pie y borrar todo el disco entero.
Saludos  :)
7  Foros Generales / Dudas Generales / Hacer que Bochs ejecute un archivo ISO envez de IMG en: 23 Marzo 2019, 01:53 am
Pues eso, no logro hacer que Bochs use archivos ISO envez de archivos IMG. Nececito usar Bochs por su debugger.
Alguna idea?
Saludos
8  Programación / ASM / Pasar argumentos a una función externa de C desde NASM en: 26 Febrero 2019, 02:22 am
Hola de nuevo aquí, veo que esta sección es algo relajada.
En fin, me gustaría saber como puedo pasar argumentos a una función de C desde NASM.
Ejemplo tengo una función en C declarada así:
Código
  1. void k_readkb(char* buf, int n);
Como podria pasar un argumento que tengo en ecx (a ecx se mueve un puntero a un area de memoria, que es un buffer, donde se dejaran los caracteres, un resb en .bss) hacia el primer argumento de la función de C y edx al 2do argumento de la función? Y en caso de que tenga más argumentos?
Me lio un poco con los registros, y no he encontrado mucho acerca de esto.
Saludos.
9  Programación / Programación C/C++ / [C]Es posible tener una funcion en un struct? en: 26 Febrero 2019, 01:16 am
Es posible (en C) tener una función dentro de un struct? Algo así más o menos:
Código
  1. struct foo
  2. {
  3.    int bar = 3;
  4.    int sumar(int x, int y);
  5. };
  6.  
  7. int sumar(int x, int y)
  8. {
  9.    x += y;
  10. }
  11.  
  12. int main()
  13. {
  14.    struct foo asd;
  15.    int spam = asd.bar;
  16.    asd.sumar(5, 5);
  17.    return 0;
  18. }
  19.  
Escuche que en C++ se podía, pero como lo puedo hacer en C?
La idea seria tener funciones mas organizadas, se podría con POO si estuviera en C++, pero sinceramente me da asco la forma en que se declaran clases en C++  ;-), aparte que solo puedo usar C ahora.
Saludos
10  Programación / ASM / cmp no funciona en: 22 Febrero 2019, 19:58 pm
Pues tengo esta simple rutina en ensamblador (NASM):
Código
  1. isr80:
  2.    cli
  3.    push byte 0
  4.    push byte 80
  5.    cmp eax, 3
  6.    je .read_srv
  7.    cmp eax, 4
  8.    je .write_srv
  9.    jmp .end
  10.    .read_srv:
  11.    mov ecx, strinputbuff
  12.    mov eax, ebx
  13.    call k_readkb
  14.    xor eax, eax
  15.    .write_srv:
  16.    mov ecx, testmsg
  17.    push ecx
  18.    call kputs
  19.    pop ecx
  20.    jmp isr_common_stub
  21.    .end:
  22.  
Bueno, si mueves el valor 4 a eax, te imprime un texto, si mueves 3 a eax te lee el teclado, etc.
Pero no funciona, sea cual sea el valor que mueva a eax igualmente salta a la subrutina .write_srv.
Me tiene loco este error (por que no es la primera vez que me pasa, cada vez que uso cmp). Alguna idea?
PD: No estoy programando para un SO en específico.
Páginas: [1] 2 3 4
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines