Autor
|
Tema: no funciona ReadFile y overlapped (Leído 3,059 veces)
|
Belial & Grimoire
Desconectado
Mensajes: 559
Tea_Madhatter
|
hola tengo un problema con Readfile d1 = (DWORD*)&crbig; overlapped.Offset = d1[1]; overlapped.OffsetHigh = d1[0]; ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped);
tengo a crbig que es igual a 322122547 los coloco en overlapped low y high offsethigh = 00000003 offset = 22122547; supuestamente ReadFile deberia leer los datos de la unidad hDevice, en este caso 1024 bytes y deberia empezar a leer desde donde le digo a overlapped que lo haga al inicio lo hago de esta manera ya que quiero leer el inicio de la unidad ZeroMemory(&overlapped ,sizeof(OVERLAPPED)); hDevice = CreateFileW(zwpath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); if(hDevice != INVALID_HANDLE_VALUE){ ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped); }
si coloco un for de esta manera para saber que aparecio, me salen los bytes sin probemas en un printf for (int n=0; n<sizeof(buff); n++) { }
pero despues es cuando modifico overlapped y uso por segunda vez ReadFile d1 = (DWORD*)&crbig; overlapped.Offset = d1[1]; overlapped.OffsetHigh = d1[0]; ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped);
pero me siguen apareciendo los mismo bytes en el for(), ya intente antes de usar por segunda vez ReadFile, borrar el buffer usando memset e incluso usando un buffer diferente, pero me sigue mostrando lo mismo y supuestamente como les mencione, deberia avanzar hacia donde overlapped dice, deberia leer los 1024 bytes de esa zona, y lo que deberia pasar es que el for me deberia mostrar otros bytes, pero no parece funcionar alguien sabe o tiene alguna idea de porque no funciona? salu2
|
|
|
En línea
|
.
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
¿Porqué razon necesitas hacer lecturas asincrónicas? ¿Es tu aplicación de multihilos?
Sino, pues se usa la funcion SetFilePointer para leer algun archivo o dispositivo apartir de un offset.
|
|
|
En línea
|
|
|
|
Belial & Grimoire
Desconectado
Mensajes: 559
Tea_Madhatter
|
pues como le mencione en varios post, estoy siguiendo ejemplos de VB.net sobre MFT, ahorita trato de convertir un codigo de VB a C para ir aprendiendo que hace el programa, ya entendi la mitad junto con varios post teoricos sobre MFT, en este momento con overlapped estoy por llegar a MFT para empezar a tomar los atributos, donde se encuentran los nombres de archivos que estan en la computadora o fueron eliminados pero no puedo avanzar con readfile y overlapped en VB usan overlapped para moverse por bytes, por ejemplo Private Sub SetReadFileOffset(ByRef NO As System.Threading.NativeOverlapped, ByRef curBig As Int64) Dim lowoffset() As Byte = BitConverter.GetBytes(curBig) Dim highoffset As Int32 = BitConverter.ToInt32(lowoffset, 0) Dim high As Int32 Dim lastbytes(3) As Byte Array.Copy(lowoffset, 4, lastbytes, 0, 4) high = BitConverter.ToInt32(lastbytes, 0) NO.OffsetLow = highoffset NO.OffsetHigh = high End Sub
Esto es hacer lo mismo que esto crbig = (sectperclusters * (bytespercluster * MFTCluster)); d1 = (DWORD*)&crbig; overlapped.Offset = d1[1]; overlapped.OffsetHigh = d1[0];
pero usandolo en Readfile parece que no funciona
|
|
|
En línea
|
.
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
pues como le mencione en varios post, estoy siguiendo ejemplos de VB.net sobre MFT, ahorita trato de convertir un codigo de VB a C para ir aprendiendo que hace el programa, ya entendi la mitad junto con varios post teoricos sobre MFT, en este momento con overlapped estoy por llegar a MFT para empezar a tomar los atributos, donde se encuentran los nombres de archivos que estan en la computadora o fueron eliminados pero no puedo avanzar con readfile y overlapped en VB usan overlapped para moverse por bytes, por ejemplo Private Sub SetReadFileOffset(ByRef NO As System.Threading.NativeOverlapped, ByRef curBig As Int64) Dim lowoffset() As Byte = BitConverter.GetBytes(curBig) Dim highoffset As Int32 = BitConverter.ToInt32(lowoffset, 0) Dim high As Int32 Dim lastbytes(3) As Byte Array.Copy(lowoffset, 4, lastbytes, 0, 4) high = BitConverter.ToInt32(lastbytes, 0) NO.OffsetLow = highoffset NO.OffsetHigh = high End Sub
Esto es hacer lo mismo que esto crbig = (sectperclusters * (bytespercluster * MFTCluster)); d1 = (DWORD*)&crbig; overlapped.Offset = d1[1]; overlapped.OffsetHigh = d1[0];
pero usandolo en Readfile parece que no funciona Lo mismo he visto que pasa en los anteriores temas, no podes esperar que ambos languajes traten de igual manera los diferentes tipos de variables menos una framework como .NET puede tener sus propias maneras de como manipular array de bytes, cadenas ,etc. Omite la lectura asincrónica y usa SetFilePointer para establecer el inicio en donde ReadFile queres que haga la lectura. Acerca de porqué no aparecen los bytes, en el código C puede seer debido a que estas haciendo lectura asincrónica y los bytes no son aun escritos en el buffer cuando estas intentado usarlos. no podria estar seguro ya que el código es incompleto. Luego si tenes problemas con esto pues publica toda la función.
|
|
|
En línea
|
|
|
|
Belial & Grimoire
Desconectado
Mensajes: 559
Tea_Madhatter
|
Este es el codigo que llevo hecho, por el momento todo me ha funcionado bien, hasta ahorita con overlapped #include <Windows.h> #include <winioctl.h> #include <stdio.h> #include <stdlib.h> #define zwpath L"\\\\.\\C:" long endianhextodec(BYTE *buffers, int offs){ BYTE tmp[2] = {0}; BYTE tmp2[1] = {0}; BYTE tmp3[3] = {0}; BYTE tmp4[1] = {0}; if(offs == 11){ tmp[0] = buffers[11]; tmp[1] = buffers[12]; return tmp[1] << 8; } if(offs == 13){ tmp2[0] = buffers[13]; return tmp2[0]; } if(offs == 30){ tmp3[0] = buffers[48]; tmp3[1] = buffers[49]; tmp3[2] = buffers[50]; return tmp3[2] << 16; }else{return 0;} } int main(int argc, char *argv[]){ HANDLE hDevice; OVERLAPPED overlapped; DWORD crbig; BYTE buff[1024] = {0}; DWORD numerobyte = 0, nbytes = 0; UINT32 ret; DWORD *d1; int offset1 = 11, offset2 = 13, offset3 = 30; long MFTCluster = 0, bytespercluster = 0, sectperclusters = 0, offet = 0; unsigned long mult = 0; ZeroMemory(&overlapped ,sizeof(OVERLAPPED)); hDevice = CreateFileW(zwpath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); if(hDevice != INVALID_HANDLE_VALUE){ ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped); }else { return NULL; } if(ret == 0){ ret = WaitForSingleObject(hDevice,INFINITE ); switch (ret) { case WAIT_OBJECT_0:break; case WAIT_TIMEOUT:break; default: break; } } else { return NULL; } if((int)buff[3] == 'N' && (int)buff[4] == 'T' && (int)buff[5] == 'F' && (int)buff[6] == 'S' ){ printf("Volumen es formato NTFS\n\n\n"); } bytespercluster = endianhextodec(buff, offset1); sectperclusters = endianhextodec(buff, offset2); MFTCluster = endianhextodec(buff, offset3); printf("Bytes por clusters = %d\nsectores por clusters = %d\nMFTClusters = %ld\n\n", bytespercluster , sectperclusters , MFTCluster ); crbig = (sectperclusters * (bytespercluster * MFTCluster)); d1 = (DWORD*)&crbig; overlapped.Offset = d1[1]; overlapped.OffsetHigh = d1[0]; ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped); if(ret == 0){ ret = WaitForSingleObject(hDevice,INFINITE ); switch (ret) { case WAIT_OBJECT_0:break; default: break; } } else { return NULL; } for (int n=0; n<sizeof(buff); n++) { } CloseHandle(hDevice); }
Y este es la parte del codigo de VB.NET que he hecho en C Public Function IsNFTSDrive(ByVal strDrive As String) As Boolean Dim Hnd As Integer, nRead As Integer Dim ret As UInt32 Dim Buffer(1024) As Byte Hnd = CreateFile("\\.\" & Mid(strDrive, 1, 2), GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, _ Nothing, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL Or FILE_FLAG_OVERLAPPED, IntPtr.Zero) If (Hnd <> INVALID_HANDLE_VALUE) Then ret = ReadFile(Hnd, Buffer, 1024, nRead, New System.Threading.NativeOverlapped) Console.WriteLine(Buffer(200)) Else Return False End If If ret = 0 Then ret = WaitForSingleObject(Hnd, INFINITE) Select Case ret Case WAIT_OBJECT_0 Case WAIT_TIMEOUT End Select Else Return False End If CloseHandle(Hnd) Return Buffer(3) = 78 And Buffer(4) = 84 And Buffer(5) = 70 And Buffer(6) = 83 End Function Public Function GetFiles(ByVal strDrive As String, ByVal bnAllFiles As Boolean) As DataTable Dim Hnd As Integer, nRead As Integer Dim ret As UInt32 Dim Buffer(1024) As Byte Dim BytesPerSect As Long Dim SectperCluster As Long Dim MFTCluster As Long Dim intIgnoredFiles As Integer = 0 Dim NO As System.Threading.NativeOverlapped 'Read Partition Info Hnd = CreateFile("\\.\" & Mid(strDrive, 1, 2), GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, _ Nothing, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL Or FILE_FLAG_OVERLAPPED, IntPtr.Zero) If (Hnd <> INVALID_HANDLE_VALUE) Then ret = ReadFile(Hnd, Buffer, 1024, nRead, NO) Else Return Nothing End If If ret = 0 Then ret = WaitForSingleObject(Hnd, INFINITE) Select Case ret Case WAIT_OBJECT_0 Case WAIT_TIMEOUT End Select Else Return Nothing End If BytesPerSect = LittleEndianHEXToDecimal(Buffer, &HB, 2) SectperCluster = LittleEndianHEXToDecimal(Buffer, &HD, 1) MFTCluster = LittleEndianHEXToDecimal(Buffer, &H30, 8) 'Read MFT SetReadFileOffset(NO, MFTCluster * SectperCluster * BytesPerSect) ret = ReadFile(Hnd, Buffer, 1024, nRead, NO) If ret = 0 Then ret = WaitForSingleObject(Hnd, INFINITE) Select Case ret Case WAIT_OBJECT_0 Case Else End Select Else Return Nothing End If
Private Function LittleEndianHEXToDecimal(ByRef Buffer As Byte(), ByVal offset As Long, ByVal Length As Long) As Long If Length = 1 Then Return BitConverter.ToInt16(Buffer, offset) End If If Length = 2 Then Return BitConverter.ToInt16(Buffer, offset) End If If Length = 4 Then Return BitConverter.ToInt32(Buffer, offset) End If If Length = 8 Then Return BitConverter.ToInt64(Buffer, offset) End If End Function
Private Sub SetReadFileOffset(ByRef NO As System.Threading.NativeOverlapped, ByRef curBig As Int64) Dim lowoffset() As Byte = BitConverter.GetBytes(curBig) Dim highoffset As Int32 = BitConverter.ToInt32(lowoffset, 0) Dim high As Int32 Dim lastbytes(3) As Byte Array.Copy(lowoffset, 4, lastbytes, 0, 4) high = BitConverter.ToInt32(lastbytes, 0) NO.OffsetLow = highoffset NO.OffsetHigh = high End Sub
Donde empieza mi problema es en la ultima parte donde dice 'Read MFT del codigo VB
|
|
|
En línea
|
.
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
Bien hoy si esta más claro. Nota la declaración de crbig y como lo uso. #define zwpath L"\\\\.\\C:" long endianhextodec(BYTE *buffers, int offs) { BYTE tmp[2] = {0}; BYTE tmp2[1] = {0}; BYTE tmp3[3] = {0}; BYTE tmp4[1] = {0}; if(offs == 11){ tmp[0] = buffers[11]; tmp[1] = buffers[12]; return tmp[1] << 8; } if(offs == 13){ tmp2[0] = buffers[13]; return tmp2[0]; } if(offs == 30){ tmp3[0] = buffers[48]; tmp3[1] = buffers[49]; tmp3[2] = buffers[50]; return tmp3[2] << 16; }else{return 0;}
} int main(int argc, char *argv[]){ { HANDLE hDevice; OVERLAPPED overlapped; LARGE_INTEGER crbig; BYTE buff[1024] = {0}; DWORD numerobyte = 0, nbytes = 0; UINT32 ret; DWORD *d1; int offset1 = 11, offset2 = 13, offset3 = 30; long MFTCluster = 0, bytespercluster = 0, sectperclusters = 0, offet = 0; unsigned long mult = 0; ZeroMemory(&overlapped ,sizeof(OVERLAPPED)); hDevice = CreateFileW(zwpath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); if(hDevice != INVALID_HANDLE_VALUE){ ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped); }else { return NULL; } if(ret == 0){ ret = WaitForSingleObject(hDevice,INFINITE ); switch (ret) { case WAIT_OBJECT_0:break; case WAIT_TIMEOUT:break; default: break; } } else { return NULL; } if((int)buff[3] == 'N' && (int)buff[4] == 'T' && (int)buff[5] == 'F' && (int)buff[6] == 'S' ){ printf("Volumen es formato NTFS\n\n\n"); } bytespercluster = endianhextodec(buff, offset1); sectperclusters = endianhextodec(buff, offset2); MFTCluster = endianhextodec(buff, offset3); printf("Bytes por clusters = %d\nsectores por clusters = %d\nMFTClusters = %ld\n\n", bytespercluster, sectperclusters, MFTCluster);
RtlZeroMemory(&overlapped ,sizeof(OVERLAPPED)); crbig.QuadPart = (sectperclusters * (bytespercluster * MFTCluster)); overlapped.Offset = crbig.LowPart; overlapped.OffsetHigh = crbig.HighPart; ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped); if(ret == 0){
ret = WaitForSingleObject(hDevice,INFINITE ); switch (ret) { case WAIT_OBJECT_0:break; default: break; } } else { return NULL; } for (int n=0; n<sizeof(buff); n++) { printf("0x%02X ", buff[n]); } CloseHandle(hDevice); getchar(); }
por cierto, yo no sé porqué estos tios usaron lectura asincronica, no sé si la aplicación es de multihilos de todos modos se puede usar SetFilePointer en lugar de FILE_FLAG_OVERLAPPED y WaitForSingleObject lo veo totalmente inutil, quizas no conocian SetFilePointer...
|
|
|
En línea
|
|
|
|
Belial & Grimoire
Desconectado
Mensajes: 559
Tea_Madhatter
|
coincido contigo sobre WaitForSingleObject, pero no quiero empezar a hacer preguntas de algo que no me funciono y darme cuenta que fue por no colocar algo que en el otro codigo si habia, pero terminando hare lo que me mencionas sobre SetFilePointer y quitare y optimizare otras cosas que las estoy dejando pasar por ahora, solo que no me habia tocado el momento de trabajar con varias funciones y API's de ahorita, por eso se me esta dificultando entender y el codigo que me pusiste, no se si estoy haciendo algo mal, porque el prinft me sigue mostrando los mismo bytes, como que no avanza, y necesito avanzar dependiendo el valor de overlapped, porque en el codigo de VB.net me sale un offset de 56 + 1 Dim offset As Long = LittleEndianHEXToDecimal(Buffer, 20, 2) + 1
al principio creia que no encontraba ese offset, pero lo busque y ninguno del offset 20 me sale 56 en decimal, es la suma de 2 bytes segun bitconverter, entonces es donde me di cuenta que readfile no avanza y parece que lee los mismo bytes acabo de compilar el codigo y avanza igual de bien, pero me sigue mostrando los mismos bytes del inicio, en el tercer offset empieza NTFS, asi que sigue siendo el inicio y eso es lo que no entiendo, porque no avanza 0xEB 0x52 0x90 0x4E 0x54 0x46 0x53 0x20 0x20 0x20 0x20 0x00 0x02 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xF8 0x00 0x00 0x3F 0x00 0xFF 0x00 0x00 0x28 0x03 0x00 0x00 0x00 0x00 0x00 0x80 0x00 0x80 0x00 0xFF 0xAF 0xEE 0x0C 0x00 0x00 0x00 0x00 0x00 0x00 0x0C 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xF6 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x87 0xFF 0x92 0x82 0x24 0x93 0x82 0x1E 0x00 0x00 0x00 0x00 0xFA 0x33 0xC0 0x8E 0xD0 0xBC 0x00 0x7C 0xFB 0x68 0xC0 0x07 0x1F 0x1E 0x68 0x66 0x00 0xCB 0x88 0x16 0x0E 0x00 0x66 0x81 0x3E 0x03 0x00 0x4E 0x54 0x46 0x53 0x75 0x15 0xB4 0x41 0xBB 0xAA 0x55 0xCD 0x13 0x72 0x0C 0x81 0xFB 0x55 0xAA 0x75 0x06 0xF7 0xC1 0x01 0x00 0x75 0x03 0xE9 0xDD 0x00 0x1E 0x83 0xEC 0x18 0x68 0x1A 0x00 0xB4 0x48 0x8A 0x16 0x0E 0x00 0x8B 0xF4 0x16 0x1F 0xCD 0x13 0x9F 0x83 0xC4 0x18 0x9E 0x58 0x1F 0x72 0xE1 0x3B 0x06 0x0B 0x00 0x75 0xDB 0xA3 0x0F 0x00 0xC1 0x2E 0x0F 0x00 0x04 0x1E 0x5A 0x33 0xDB 0xB9 0x00 0x20 0x2B 0xC8 0x66 0xFF 0x06 0x11 0x00 0x03 0x16 0x0F 0x00 0x8E 0xC2 0xFF 0x06 0x16 0x00 0xE8 0x4B 0x00 0x2B 0xC8 0x77 0xEF 0xB8 0x00 0xBB 0xCD 0x1A 0x66 0x23 0xC0 0x75 0x2D 0x66 0x81 0xFB 0x54 0x43 0x50 0x41 0x75 0x24 0x81 0xF9 0x02 0x01 0x72 0x1E 0x16 0x68 0x07 0xBB 0x16 0x68 0x70 0x0E 0x16 0x68 0x09 0x00 0x66 0x53 0x66 0x53 0x66 0x55 0x16 0x16 0x16 0x68 0xB8 0x01 0x66 0x61 0x0E 0x07 0xCD 0x1A 0x33 0xC0 0xBF 0x28 0x10 0xB9 0xD8 0x0F 0xFC 0xF3 0xAA 0xE9 0x5F 0x01 0x90 0x90 0x66 0x60 0x1E 0x06 0x66 0xA1 0x11 0x00 0x66 0x03 0x06 0x1C 0x00 0x1E 0x66 0x68 0x00 0x00 0x00 0x00 0x66 0x50 0x06 0x53 0x68 0x01 0x00 0x68 0x10 0x00 0xB4 0x42 0x8A 0x16 0x0E 0x00 0x16 0x1F 0x8B 0xF4 0xCD 0x13 0x66 0x59 0x5B 0x5A 0x66 0x59 0x66 0x59 0x1F 0x0F 0x82 0x16 0x00 0x66 0xFF 0x06 0x11 0x00 0x03 0x16 0x0F 0x00 0x8E 0xC2 0xFF 0x0E 0x16 0x00 0x75 0xBC 0x07 0x1F 0x66 0x61 0xC3 0xA0 0xF8 0x01 0xE8 0x09 0x00 0xA0 0xFB 0x01 0xE8 0x03 0x00 0xF4 0xEB 0xFD 0xB4 0x01 0x8B 0xF0 0xAC 0x3C 0x00 0x74 0x09 0xB4 0x0E 0xBB 0x07 0x00 0xCD 0x10 0xEB 0xF2 0xC3 0x0D 0x0A 0x45 0x72 0x72 0x6F 0x72 0x20 0x64 0x65 0x20 0x64 0x69 0x73 0x63 0x6F 0x00 0x0D 0x0A 0x46 0x61 0x6C 0x74 0x61 0x20 0x62 0x6F 0x6F 0x74 0x6D 0x67 0x72 0x00 0x0D 0x0A 0x42 0x6F 0x6F 0x74 0x6D 0x67 0x72 0x20 0x63 0x6F 0x6D 0x70 0x72 0x69 0x6D 0x69 0x64 0x6F 0x00 0x0D 0x0A 0x50 0x72 0x65 0x73 0x2E 0x20 0x43 0x74 0x72 0x6C 0x2B 0x41 0x6C 0x74 0x2B 0x53 0x75 0x70 0x72 0x20 0x70 0x61 0x72 0x61 0x20 0x72 0x65 0x69 0x6E 0x69 0x63 0x69 0x61 0x72 0x0D 0x0A 0x00 0x6C 0x20 0x74 0x6F 0x20 0x72 0x65 0x73 0x74 0x61 0x72 0x74 0x0D 0x0A 0x00 0x8C 0x9D 0xAD 0xC2 0x00 0x00 0x55 0xAA 0x07 0x00 0x42 0x00 0x4F 0x00 0x4F 0x00 0x54 0x00 0x4D 0x00 0x47 0x00 0x52 0x00 0x04 0x00 0x24 0x00 0x49 0x00 0x33 0x00 0x30 0x00 0x00 0xD4 0x00 0x00 0x00 0x24 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xEB 0x22 0x90 0x90 0x05 0x00 0x4E 0x00 0x54 0x00 0x4C 0x00 0x44 0x00 0x52 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x66 0x0F 0xB7 0x06 0x0B 0x00 0x66 0x0F 0xB6 0x1E 0x0D 0x00 0x66 0xF7 0xE3 0x66 0xA3 0x52 0x02 0x66 0x8B 0x0E 0x40 0x00 0x80 0xF9 0x00 0x0F 0x8F 0x0E 0x00 0xF6 0xD9 0x66 0xB8 0x01 0x00 0x00 0x00 0x66 0xD3 0xE0 0xEB 0x08 0x90 0x66 0xA1 0x52 0x02 0x66 0xF7 0xE1 0x66 0xA3 0x66 0x02 0x66 0x0F 0xB7 0x1E 0x0B 0x00 0x66 0x33 0xD2 0x66 0xF7 0xF3 0x66 0xA3 0x56 0x02 0xE8 0x95 0x04 0x66 0x8B 0x0E 0x4E 0x02 0x66 0x89 0x0E 0x26 0x02 0x66 0x03 0x0E 0x66 0x02 0x66 0x89 0x0E 0x2A 0x02 0x66 0x03 0x0E 0x66 0x02 0x66 0x89 0x0E 0x2E 0x02 0x66 0x03 0x0E 0x66 0x02 0x66 0x89 0x0E 0x3E 0x02 0x66 0x03 0x0E 0x66 0x02 0x66 0x89 0x0E 0x46 0x02 0x66 0xB8 0x90 0x00 0x00 0x00 0x66 0x8B 0x0E 0x26 0x02 0xE8 0x83 0x09 0x66 0x0B 0xC0 0x0F 0x84 0x5E 0xFE 0x66 0xA3 0x32 0x02 0x66 0xB8 0xA0 0x00 0x00 0x00 0x66 0x8B 0x0E 0x2A 0x02 0xE8 0x6A 0x09 0x66 0xA3 0x36 0x02 0x66 0xB8 0xB0 0x00 0x00 0x00 0x66 0x8B 0x0E 0x2E 0x02 0xE8 0x58 0x09 0x66 0xA3 0x3A 0x02 0x66 0xA1 0x32 0x02 0x66 0x0B 0xC0 0x0F 0x84 0x2B 0xFE 0x67 0x80 0x78 0x08 0x00 0x0F 0x85 0x22 0xFE 0x67 0x66 0x8D 0x50 0x10 0x67 0x03 0x42 0x04 0x67 0x66 0x0F 0xB6 0x48 0x0C 0x66 0x89 0x0E 0x72 0x02 0x67 0x66 0x8B 0x48 0x08 0x66 0x89 0x0E 0x6E 0x02 0x66 0xA1 0x6E 0x02 0x66 0x0F 0xB7 0x0E 0x0B 0x00 0x66 0x33 0xD2 0x66 0xF7 0xF1 0x66 0xA3 0x76 0x02 0x66 0xA1 0x46 0x02 0x66 0x03 0x06 0x6E 0x02 0x66 0xA3 0x4A 0x02 0x66 0x83 0x3E 0x36 0x02 0x00 0x0F 0x84 0x1D 0x00 0x66 0x83 0x3E 0x3A 0x02 0x00 0x0F 0x84 0xCF 0xFD 0x66 0x8B 0x1E 0x3A 0x02 0x1E 0x07 0x66 0x8B 0x3E 0x4A 0x02 0x66 0xA1 0x2E 0x02 0xE8 0xE0 0x01 0x66 0x0F 0xB7 0x0E 0x00 0x02 0x66 0xB8 0x02 0x02 0x00 0x00 0xE8 0x22 0x08 0x66 0x0B 0xC0 0x0F 0x85 0x16 0x00 0x66 0x0F 0xB7 0x0E 0x5A 0x02 0x66 0xB8 0x5C 0x02 0x00 0x00 0xE8 0x0C 0x08 0x66 0x0B 0xC0 0x0F 0x84 0x42 0x0C 0x67 0x66 0x8B 0x00 0x1E 0x07 0x66 0x8B 0x3E 0x3E 0x02 0xE8 0x3F 0x06 0x66 0xA1 0x3E 0x02 0x66 0xBB 0x20 0x00 0x00 0x00 0x66 0xB9 0x00 0x00 0x00 0x00 0x66 0xBA 0x00 0x00 0x00 0x00 0xE8 0xE4
|
|
|
En línea
|
.
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
Hice esta traducción rapida, nota que use la estructura que creo que es la estabas buscando la vez pasada, de esta manera accedemos a los campos directamente. pero sino, pues como dije no hay necesidad de hacer conversion a diferencia como en NET. simplemente haces algo como esto: variable = *((SizeOfType*)&Pointer[offset]); / SizeOfType = BYTE, WORD, etc y obtendras el campo Uso VC++ como compilador por si tenes problemas al compilar con directivas propias ( #pragma pack, tipos, etc ). #pragma pack(push, 1) typedef struct _BIOS_PARAMETERS_BLOCK { USHORT BytesPerSector; UCHAR SectorsPerCluster; UCHAR Unused0[7]; UCHAR MediaId; UCHAR Unused1[2]; USHORT SectorsPerTrack; USHORT Heads; UCHAR Unused2[4]; UCHAR Unused3[4]; } BIOS_PARAMETERS_BLOCK, *PBIOS_PARAMETERS_BLOCK; typedef struct _EXTENDED_BIOS_PARAMETERS_BLOCK { USHORT Unknown[2]; ULONGLONG SectorCount; ULONGLONG MftLocation; ULONGLONG MftMirrLocation; CHAR ClustersPerMftRecord; UCHAR Unused4[3]; CHAR ClustersPerIndexRecord; UCHAR Unused5[3]; ULONGLONG SerialNumber; UCHAR Checksum[4]; } EXTENDED_BIOS_PARAMETERS_BLOCK, *PEXTENDED_BIOS_PARAMETERS_BLOCK; typedef struct _BOOT_SECTOR { UCHAR Jump[3]; UCHAR OEMID[8]; BIOS_PARAMETERS_BLOCK BPB; EXTENDED_BIOS_PARAMETERS_BLOCK EBPB; UCHAR BootStrap[426]; USHORT EndSector; } BOOT_SECTOR, *PBOOT_SECTOR; #pragma pack(pop) VOID GetFiles(LPSTR SzDrive) { if(!SzDrive) return; CHAR SzSymDrive[40] = "\\\\.\\"; HANDLE hDrive; BYTE DriveContent[1024]; DWORD BytesRead; PBOOT_SECTOR lpBootSector; LARGE_INTEGER MFTLcl; strcat(SzSymDrive,SzDrive); hDrive = CreateFileA(SzSymDrive,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL); if(hDrive == INVALID_HANDLE_VALUE) { return; } if( (!ReadFile(hDrive,DriveContent,sizeof(DriveContent),&BytesRead,NULL)) || (BytesRead != sizeof(DriveContent)) ) { goto clhandle; } lpBootSector = (PBOOT_SECTOR)DriveContent; MFTLcl.QuadPart = lpBootSector->BPB.BytesPerSector * lpBootSector->BPB.SectorsPerCluster * lpBootSector->EBPB.MftLocation; if(SetFilePointer(hDrive,MFTLcl.LowPart,&MFTLcl.HighPart,FILE_BEGIN) == INVALID_SET_FILE_POINTER) { goto clhandle; } if( (!ReadFile(hDrive,DriveContent,sizeof(DriveContent),&BytesRead,NULL)) || (BytesRead != sizeof(DriveContent)) ) { goto clhandle; } // ... clhandle: CloseHandle(hDrive); }
- llamar por ejemplo: GetFiles("C:");
|
|
« Última modificación: 4 Febrero 2014, 06:54 am por x64Core »
|
En línea
|
|
|
|
Belial & Grimoire
Desconectado
Mensajes: 559
Tea_Madhatter
|
hola, perdon por contestar hasta ahora pero se me acabo el tiempo, tengo que regresar a la escuela y con el trabajo ya no creo tener tanto tiempo pero tienes razon, yo estaba utilizando otra estructura que era NTFS_VOLUME_DATA_BUFFER typedef struct { LARGE_INTEGER VolumeSerialNumber; LARGE_INTEGER NumberSectors; LARGE_INTEGER TotalClusters; LARGE_INTEGER FreeClusters; LARGE_INTEGER TotalReserved; DWORD BytesPerSector; DWORD BytesPerCluster; DWORD BytesPerFileRecordSegment; DWORD ClustersPerFileRecordSegment; LARGE_INTEGER MftValidDataLength; LARGE_INTEGER MftStartLcn; LARGE_INTEGER Mft2StartLcn; LARGE_INTEGER MftZoneStart; LARGE_INTEGER MftZoneEnd; } NTFS_VOLUME_DATA_BUFFER, *PNTFS_VOLUME_DATA_BUFFER; pero tuve dos problemas, la primera fue un error mio que no me habia dado cuenta que no estaba leyendo $BOOT sino otro que era Disk_Geometry, fue cuando me di cuenta que debia hacerlo funcionar con C: y no PhysicalDrive0 y la segunda fue que no encontraba SectorsPerCluster hice un intento de multiplicarlo directamente por 8 con el anterior codigo y me salio el mismo resultado que en el codigo de arriba en este momento MFTcl.QuadPart = ntfsData.MftStartLcn.QuadPart * ntfsData.BytesPerSector * 8;
pero ya no me dio tiempo de arreglar SetFilePointer y Readfile, asi que ejecute el programa pero enseguida salto a CloseHandle(hDevice); con el if INVALID_SET_FILE_POINTER pero bueno, supuestamente con esto ya deberia haber llegado a $MFT, de aqui deberia empezar a leer las entradas MFT, donde ya podria encontrar los archivos junto con sus atributos y se encuentran en cada 1024 bytes Gracias x64Core, logre avanzar bastante gracias a tu ayuda, seguire un poco lento pero quiero terminar de aprender esto salu2
|
|
« Última modificación: 7 Febrero 2014, 00:50 am por Belial & Grimoire »
|
En línea
|
.
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
X-oom funciona pero no funciona (sungoku?)
Multimedia
|
Lordofchaos
|
4
|
4,321
|
12 Diciembre 2005, 20:44 pm
por Sourraund
|
|
|
Login con md5 , BD funciona pero no funciona
« 1 2 »
PHP
|
securedigital
|
16
|
10,192
|
25 Mayo 2007, 17:46 pm
por securedigital
|
|
|
Declaración de la API ReadFile
Programación Visual Basic
|
NekroByte
|
2
|
2,127
|
7 Agosto 2007, 05:37 am
por NekroByte
|
|
|
Problemas con WriteFile & ReadFile..
« 1 2 »
Programación Visual Basic
|
illuminat3d
|
10
|
4,331
|
27 Marzo 2010, 13:39 pm
por illuminat3d
|
|
|
Problema interceptando ReadFile
Programación C/C++
|
sonnyk88
|
7
|
3,809
|
30 Julio 2010, 00:09 am
por Eternal Idol
|
|