Buenas, estoy creando un proyecto en ensamblador bastante interesante, pero debido a algo no puedo avanzar.
Estoy tratando de buscar las DLLs del la ruta actual del programa en ejecución y almacenarlos en una Matriz, pero cuando quiero utilizarlos, solo aparece el nombre de una sola DLL en la matriz de longitud 2.
start:
; Obtenemos la dirección actual del programa.
invoke GetModuleFileNameA,0,ProgramaRuta,255 ; Obtenemos la ruta actual del programa.
cmp eax,0
jbe ErrorRutaInvalida
; El siguiente código agarra la dirección actual del programa y la modifica para FindFirstFile.
; Ejemplo: "C:\Users\DarkBlue\FASM\Programa.exe" a "C:\Users\DarkBlue\FASM\*.dll"
; Sin apis extras :v
mov ebx,ProgramaRuta
mov ecx,256
BuscarCaracter:
dec ecx
cmp ecx,0
je ErrorEcxEsCero
cmp byte[ebx+ecx],"\"
je FinDeTruncado
mov byte[ebx+ecx],0
jne BuscarCaracter
FinDeTruncado:
mov dword [ebx+ecx+1],"*.dl"
mov byte [ebx+ecx+5],"l"
; Aca vamos a buscar las DLLS.
invoke FindFirstFile,ProgramaRuta,WFD
cmp eax,-1
je ErrorFindFirstFile
mov [PtrFindFirstFile],eax
mov ebx,-4
BuscarDlls: ; ZONA DE ERROR.
add ebx,4
mov dword[MatrizArchivos+ebx],WFD.cFileName
invoke FindNextFile,[PtrFindFirstFile],WFD
cmp eax,0
jne BuscarDlls
invoke FindClose,[PtrFindFirstFile]
cmp eax,0
je ErrorFindClose
invoke MessageBox,0,dword[MatrizArchivos],0,0
invoke MessageBox,0,dword[MatrizArchivos+4],0,0
xor ebx,ebx
jmp Salir
En la ruta del programa hay 2 DLLs, "Biblioteca.dll y Libreria.dll", a travez de FindFirstFile obtengo Biblioteca.dll y la almacena en MatrizArchivos+EBX (en el primer sondeo es 0) y en la segunda DLL "Libreria.dll" se obtiene a travez de FindNextFile, si este no produjo error retorna a BuscarDlls, EBX se establece en 4 y se añade el puntero al nombre de la DLL en MatrizArchivos+EBX (EBX = 4).
Pero cuando trato de visualizar mediante un MessageBox, solo aparece "Libreria.dll" en ambas matrices.
¿Que estoy haciendo mal?
Disculpen la auto-respuesta, se cual es el problema, la Matriz "MatrizArchivos" apunta, en ambas matrices al mismo puntero de cadena.
MatrizArchivos[0] = &401FD5 ' Libreria.dll
MatrizArchivos[1] = &401FD5 ' Libreria.dll
La pregunta ahora es la siguiente ¿como puedo hacer para copiar en la matriz diferentes cadenas?
Tienes que crear la siguiente estructura:
Array -> Dirección donde se encuentran los punteros de los datos
[Array] -> apunta al primer elemento del array
[Array+4] -> Apunta al siguiente elemento
[Array+8] -> Apunta al siguiente elemento
Y así sucesivamente...
No sé si me he explicado bién :-\
saludos.
Cita de: fary en 10 Abril 2016, 21:46 PM
Tienes que crear la siguiente estructura:
Array -> Dirección donde se encuentran los punteros de los datos
[Array] -> apunta al primer elemento del array
[Array+4] -> Apunta al siguiente elemento
[Array+8] -> Apunta al siguiente elemento
Y así sucesivamente...
No sé si me he explicado bién :-\
saludos.
Te explicaste bién, pero el problema es que cada elemento del array contiene el mismo valor (dirección de la cadena "Libreria.dll"), la pregunta es como hacer para copiar la cadena obtenida por WFD.cFileName, crear nuevos punteros y aplicarlos a los elementos.
Lo único que tienes que hacer es reservar memoria con LocalAlloc ó malloc y guardar el puntero en tu estructura de punteros.
Cita de: fary en 11 Abril 2016, 16:42 PM
Lo único que tienes que hacer es reservar memoria con LocalAlloc ó malloc y guardar el puntero en tu estructura de punteros.
Suponia que era algo así, pero no queria tener que usar estas apis, pero bueno, gracias! tema resuelto.