Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Belial & Grimoire

#21
ok, ya entendi y logre hacerlo

se que no es necesario la conversion, pero intento hacer lo mismo que la funcion BitConverter para poder continuar, es que intento no hacer un copy - paste de codigos, asi que si quiero aprender bien, no tengo de otra mas que rehacer lo que veo para poder comprender como funcionan las cosas  :-\

gracias  ;D
#22
hola

alguien sabe como podria o si es posible concatenar bytes de un mismo array, por ejemplo

BYTE *buffer[2] = {0x00, 0x02}

me gustaria poder concatenarla pero al reves para que quede asi... 0x200, porque necesito cambiar ese valor a decimal, que serian 512 y guardarlo en algun integer

lo intente con strcpy, strcat y memcpy pero no me funcionan porque el buffer es BYTE y aun haciendo cast (char) me tira error

alguien sabe alguna forma de lograr juntar los hexadecimales del array?, porque tambien necesito hacerlo con arrays mas grandes por ejemplo

buff = {0x00, 0x00, 0x02, 0x00, 0x00, 0x00}

y necesito que quede asi 0x20000 para poder convertirlo en decimal

aguna idea o ejemplo que me puedan dar porfavor.
#23
ok, aunque creo ya lo solucione, o eso espero
#24
bueno ya resolvi el primer problema y parte del segundo, ya solo me queda saber como conseguir LCN of VCN 0 of the $MFT

segun una tabla algo asi debia salirme

0x30 LONGLONG 0x0400000000000000
   

sin embargo, en 0x30 me sale

0x00000C0000000000   :huh:
#25
hola

pues ya logre avanzar con un programa que estoy intentando hacer, despues de re-leer, hice un pequeño avance, pero tengo un problema a ver que opinan

segun MSDN hay dos maneras de analizar la unidad C, ya sea

"\\.\C:", "\\.\C:\" o "\\\\.\\PhysicalDrive0"

En visual basic algunos programadores hacen esto

"\\.\" & Mid(Drive, 1, 2)

donde Drive es "C:\"

supuestamente deberia quedar asi... "\\.\C:"... pero al colocarlo de esa forma en el programa ya no funciona, de igual forma en C tampoco funciona

en C la unica forma que me funciona es usando "\\\\.\\PhysicalDrive0", pero tengo la duda de si funcionara o no, supuestamente si me esta funcionando, porque recibo datos, pero no se si haya alguna diferencia o porque razon en VB solo funcione si utilizan Mid, por que si hay alguna, entonces el programa falla desde el principio pero no me he dado cuenta, y me gustaria saber que opinan o si podrian compilar mi codigo y decirme si a ustedes le funciona "\\.\C:" o si es normal y solo les funciono PhysicalDrive0, mas abajo colocare mi codigo

ahora tengo otro problema, necesito la informacion de los clusters, hay estructuras que puedo usar para saber esto pero no hay para algunas cosas que necesito, pero segun un codigo de VB que analice, se pueden conseguir 3 datos que necesito analizando los datos recibidos con ReadFile

Aqui dejo una tabla de los datos que mencionare


Offset    Size    Description
0x0000    3    Jump to the boot loader routine
0x0003    8    System Id: "NTFS    "
0x000B    2    Bytes per sector
0x000D    1    Sectors per cluster
0x000E    7    Unused
0x0015    1    Media descriptor (a)
0x0016    2    Unused
0x0018    2    Sectors per track
0x001A    2    Number of heads
0x001C    8    Unused
0x0024    4    Usually 80 00 80 00 (b)
0x0028    8    Number of sectors in the volume
0x0030    8    LCN of VCN 0 of the $MFT
0x0038    8    LCN of VCN 0 of the $MFTMirr
0x0040    4    Clusters per MFT Record (c)
0x0044    4    Clusters per Index Record (c)
0x0048    8    Volume serial number


los valores que necesito son el offset 0x0B 0x0D y 0x30

el codigo de VB usa una funcion llamaba bitconverter, que busca un offset y los valores los cambia a decimal

el offset Bytepersector lo puedo sacar con una estructura, tambien tengo entendido que en NTFS un cluster tiene 512 bytes, y eso son 8 sectores, y me faltaria encontrar LCN of VCN 0 of the $MFT

Supuestamente al leer los datos de la unidad, se puede saber eso unicamente llendo al offset y tomando los valores dependiendo del tamaño, y en la tabla esta el tamaño de cada offset

Pero mi problema es que no logro encontrar el offset para tomar el valor hexadecimal y convertirlo en decimal, aqui es donde tambien incluyo el problema anterior, no se si no los encuentro porque CreateFile no abre la unidad C: o es porque no estoy interpretando bien los datos

El resultado los compare con un codigo fuente de https://code.google.com/p/datarecover/ y obtengo el mismo resultado al ejecutar el programa, los dos me dan los mismo hexadecimales, aunque yo lo programe diferente

En VB me arroja este resultado Bitconverter donde busca los offset y convierte en decimal los bytes

512
8
786432

Pero leyendo los datos que me arroja buffer, no logro encontrar esa informacion

Me gustaria saber si alguien aqui podria ayudarme a encontrar la manera de saber donde se encuentran esos offset y como debo buscarlos para despues cambiar de hexadecimal a decimal

espero me puedan ayudar

salu2



#include <Windows.h>
#include <winioctl.h>
#include <stdio.h>
#include <stdlib.h>

#define zwpath L"\\\\.\\PhysicalDrive0"

int main(int argc, char *argv[]){

HANDLE hDevice;
OVERLAPPED overlapped;
BYTE buff[1024] = {0};
DWORD numerobyte = 0;
UINT32 ret;
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;
}

CloseHandle(hDevice);


for (int n=0; n<sizeof(buff); ++n)  
   {  
       printf("0x%02X ", buff[n]);  
   }

getchar();
}
#26
hola

tengo un array byte donde guardo informacion guardada por ReadFile, por ejemplo

BYTE buffer[1024]

ReadFile(HFile, buffer, sizeof(buffer), 0);

en VB.net hay una funcion que te convierte bytes en enteros se llama Bitconverter.ToInt16, lo que supuestamente hace es buscar un offset y lo que haya en ese offset lo convierte en decimal

por ejemplo

offset = &HD

BitConverter.ToInt16(buffer, offset)

alli, hasta donde yo se, es que busca en el array BYTE buffer el offset o hexadecimal que en este caso seria 0x0D, y el contenido alli lo cambia a decimal

por ejemplo

primero busca en el array 0x0D, cuando lo encuentra hay un valor que es 0x08 y lo convierte a decimal que igual seria 8, pero puede cambiar el valor, podria ser 0xAF, 0x13, etc...

Entonces quisiera saber como podria leer el array BYTE para encontrar el offset y hacer la conversion de hexadecimal a decimal de lo que haya en cierto offset pero en codigo C

porque Bitconverter convierte dependiendo la base, por ejemplo Int16 convierte los dos primeros bytes, int32 convierte los 4 primeros bytes y int64 convierte los 8 primeros bytes

entonces si por ejemplo en el offset 0x0B hay un valor 0x0102, como encontraria el offset 0x0B para cambiar el valor 0x0102 de hexadecimal a decimal?

me podrian poner algun ejemplo porfavor
#27
yo estaria feliz de que desaparezca EEUU, pero si la guerra elimina a ese pais, comenzaria otra guerra por el liderazgo mundial y entre ellos esta China y Rusia, algunos otros paises de Europa y de America

Si se acaba China o Rusia, la guerra por apropiarse de una parte de esos paises comenzara, y asi continuamente

la guerra nunca acabara, lo unico que podemos hacer es desear que no nos toque alguna guerra en nuestro pais
#28
hola

Estoy tratando de crear un codigo para recuperar archivos borrados, vengo leyendo varios documentos y viendo varios codigos, poco a poco estoy comprendiendo como funciona, hasta ahora he logrado comprender en donde se encuentra la informacion de los archivos, sobre NTFS, MFT y clusters, y mas o menos como encontrar los archivos borrados, sobre sus atributos y despues de eso me faltaria saber como restaurar los archivos

he practicado y mas abajo pondre un codigo que hice analizando codigos que hay en la red, desafortunadamente para mi, la mayoria en funcionamiento los encuentro para VB, hay otros pero son muy elaborados usando incluso clases, pero a la mayoria he visto lo mismo

Ahora... mi problema es el siguiente, ¿de que forma puedo leer los datos de MFT?, ya tengo una forma de acceso pero no logro entender como hacen ese escaneo por los datos del archivo MFT para analizar los archivos que se encuentran en mi computadora, asi como los borrados

espero alguien me pueda ayudar diciendo que API, estructura o que operacion tendria que usar ahora para empezar el analisis en MFT, porfavor, porque ya no se por donde seguir o que mas se deba hacer

dejo el codigo que mencione, pero despues de aprender esto, que mas sigue?, perdon si estan mal escrito los printf pero los escribi asi de mal porque solo fue para entender de que sirve la estructura

por cierto, he visto que algunos utilizan DISK_GEOMETRY pero yo no lo vi necesario

tambien hay unas API que vi que utilizan por ejemplo FSCTL_ENUM_USN_DATA, FSCTL_QUERY_USN_JOURNAL

Esto es lo que he logrado entender y es parecido a una parte de VB.net

#include <Windows.h>
#include <winioctl.h>
#include <stdio.h>

#define FSCTL_GET_NTFS_VOLUME_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 25, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define zwpath L"\\\\.\\PhysicalDrive0"

int main(int argc, char *argv[]){

    HANDLE hDevice = INVALID_HANDLE_VALUE;
    BOOL bresul = FALSE;
    DWORD junk = 0;

    hDevice = CreateFileW(zwpath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);

    if(hDevice == INVALID_HANDLE_VALUE){

        printf("error device\n");
    }

    NTFS_VOLUME_DATA_BUFFER ntfsData;

    bresul = DeviceIoControl(hDevice,FSCTL_GET_NTFS_VOLUME_DATA, NULL, 0, &ntfsData, sizeof(NTFS_VOLUME_DATA_BUFFER), &junk, (LPOVERLAPPED)NULL );

    printf("Numero de serie = %ld\n", ntfsData.VolumeSerialNumber);
    printf("Numero de sectores = %ld\n", ntfsData.NumberSectors);
    printf("Total clusters = %ld\n", ntfsData.TotalClusters);
    printf("Clusters libres = %ld\n", ntfsData.FreeClusters);
    printf("Total reservados = %ld\n", ntfsData.TotalReserved);
    printf("Bytes por sector = %ld\n", ntfsData.BytesPerSector);
    printf("Bytes por cluster = %ld\n", ntfsData.BytesPerCluster);
    printf("Bytes por segmeto de archivo = %ld\n", ntfsData.BytesPerFileRecordSegment);
    printf("Cluster por segmento de archivo = %ld\n", ntfsData.ClustersPerFileRecordSegment);
    printf("Longitud de datos validos MFT = %ld\n", ntfsData.MftValidDataLength);
    printf("Inicio de LCN = %ld\n", ntfsData.MftStartLcn);
    printf("Inicio mirror de LCN = %ld\n", ntfsData.Mft2StartLcn);
    printf("Zona de Inicio MFT= %ld\n", ntfsData.MftZoneStart);
    printf("Zona final MFT = %ld\n", ntfsData.MftZoneEnd);

    getchar();
}



O si alguien tiene conocimientos en VB.NET que me pueda ayudar a traducir el codigo a C tambien me ayudaria bastante

Código (vbnet) [Seleccionar]
  Public Sub FindHDFiles(ByVal Drive As String)
        Drive = Drive.TrimEnd("\")
        Try
            Dim dinfo = My.Computer.FileSystem.GetDriveInfo(Drive & "\")
            If Not dinfo.IsReady Then
                MsgBox("Drive not ready.", MsgBoxStyle.Critical, "ERROR")
                Exit Sub
            End If
            If dinfo.DriveFormat <> "NTFS" Then
                MsgBox("This feature only works on NTFS volumes.", MsgBoxStyle.Critical, "ERROR")
                Exit Sub
            End If
            ARKDDA = New DirectDriveIO(Drive & "\")
        Catch
            MsgBox("Could not access drive.", MsgBoxStyle.Critical, "ERROR")
            Exit Sub
        End Try
        Drive = Drive.TrimEnd("\")
        Dim diskhandle = CreateFile("\\?\" & Drive, EFileAccess.GENERIC_READ + EFileAccess.GENERIC_WRITE, EFileShare.FILE_SHARE_READ + EFileShare.FILE_SHARE_WRITE, Nothing, ECreationDisposition.OPEN_EXISTING, 0, Nothing)
        If diskhandle = 0 Then
            diskhandle = CreateFile("\\.\" & Drive, EFileAccess.GENERIC_READ + EFileAccess.GENERIC_WRITE, EFileShare.FILE_SHARE_READ + EFileShare.FILE_SHARE_WRITE, Nothing, ECreationDisposition.OPEN_EXISTING, 0, Nothing)
            If diskhandle = 0 Then
                MsgBox("Could not access drive.", MsgBoxStyle.Critical, "ERROR")
                Exit Sub
            End If
        End If
        Dim FSCTL_GET_NFTS_VOLUME_DATA = CTL_CODE(FILE_DEVICE.FILE_DEVICE_FILE_SYSTEM, 25, METHOD_BUFFERED, FILE_ANY_ACCESS)
        Dim buffer As NTFS_VOLUME_DATA_BUFFER
        DeviceIoControlNTFS(diskhandle, FSCTL_GET_NFTS_VOLUME_DATA, 0, 0, buffer, SizeOf(buffer), 0, 0)
        CloseHandle(diskhandle)
        Dim MFTAddress As Long = buffer.MftStartLcn * CLng(buffer.BytesPerCluster / buffer.BytesPerSector)
        Dim MFTEntrySize As Integer = buffer.BytesPerFileRecordSegment / buffer.BytesPerSector
        Dim NumberOfEntries As Long = buffer.MftValidDataLength / MFTEntrySize
        Dim Bytes(buffer.BytesPerCluster) As Byte
        Dim CurrEntryBytes(MFTEntrySize * buffer.BytesPerSector) As Byte
        Dim CurrEntry As New STANDARD_MFT_ENTRY
        Dim Type As Byte
        Dim Name As String
        Dim BaseAddr As Long
        Dim Parent As Integer
        Dim DoEventsCounter As Integer = 0
        ListView1.Items.Clear()
        ListView2.Items.Clear()
        ProgressBar1.Value = 0
        ProgressBar1.Maximum = buffer.MftValidDataLength / buffer.BytesPerFileRecordSegment
        ToolStripStatusLabel1.Text = "Finding files in " & Drive & "\..."
        Button1.Enabled = False
        Button2.Enabled = False
        ComboBox1.Enabled = False
        Button3.Enabled = False
        CheckBox2.Enabled = False
        LastDrive = Drive
        If CheckBox2.Checked Then Bitmap = ReadBitmap(Drive)
        Dim BitmapBase As Long = MFTAddress + (MFTEntrySize * 0)
        Bytes = ARKDDA.ReadSectors(BitmapBase, MFTEntrySize)
        BaseAddr = MergeToInt(Bytes, &H14, &H15) 'The offset the the first attribute
        While Bytes(baseaddr) <> &H80
            baseaddr = baseaddr + MergeToInt(Bytes, baseaddr + &H4, baseaddr + &H7) 'Add the length of the attribute to the base address to find the next attribute
        End While
        baseaddr = baseaddr + &H40
        Dim Length As ULong = 0
        Dim LenLen As Byte = 0
        Dim Offset As ULong = 0
        Dim OffLen As Byte = 0
        Dim Path As String = ""
        Dim BaseAddr2 As ULong = 0
        Dim FileSize As ULong = 0
        Dim LoopCount As Integer = 0
        Dim PartNum As Integer = 0
        While Bytes(baseaddr) > 0
            LenLen = Bytes(BaseAddr) And &HF
            OffLen = (Bytes(BaseAddr) And &HF0) / &H10
            Length = MergeToInt(Bytes, BaseAddr + 1, BaseAddr + LenLen)
            Offset = Offset + MergeToInt(Bytes, BaseAddr + 1 + LenLen, BaseAddr + LenLen + OffLen)
            For Record = 0 To ((Length * buffer.BytesPerCluster) / buffer.BytesPerFileRecordSegment) - 1
                DoEventsCounter = DoEventsCounter + 1
                If DoEventsCounter >= 100 Then
                    Application.DoEvents()
                    DoEventsCounter = 0
                End If
                Try
                    If (PartNum + 1) >= (CurrEntryBytes.Count / buffer.BytesPerFileRecordSegment) Then
                        CurrEntryBytes = ARKDDA.ReadSectors((Record * MFTEntrySize) + (Offset * (buffer.BytesPerCluster / buffer.BytesPerSector)), MFTEntrySize * 1024)
                        BaseAddr2 = 0
                        PartNum = 0
                    Else
                        'CurrEntryBytes = ByteArrayPart(CurrEntryBytes, buffer.BytesPerFileRecordSegment, UBound(CurrEntryBytes))
                        'BaseAddr2 = (((BaseAddr2 \ buffer.BytesPerFileRecordSegment) + 1) * buffer.BytesPerFileRecordSegment)
                        PartNum = PartNum + 1
                        BaseAddr2 = PartNum * buffer.BytesPerFileRecordSegment
                    End If
                    If CurrEntryBytes(BaseAddr2) <> Asc("F") Then
                        'If CurrEntryBytes(0) <> Asc("F") Then
                        GoTo dn
                    End If
                    Name = ""
                    Parent = 5
                    Path = ""
                    FileSize = 0
                    'Type = CurrEntryBytes(&H16)
                    Type = CurrEntryBytes(&H16 + BaseAddr2)
                    'If Type = MFT_ENTRY_FILE_TYPE_FLAGS.DeletedDirectory Or Type = MFT_ENTRY_FILE_TYPE_FLAGS.DeletedFile Then
                    If Type = MFT_ENTRY_FILE_TYPE_FLAGS.DeletedFile Then
                        'BaseAddr2 = BaseAddr2 + MergeToInt(CurrEntryBytes, &H14, &H15) 'The offset the the first attribute
                        BaseAddr2 = BaseAddr2 + MergeToInt(CurrEntryBytes, BaseAddr2 + &H14, BaseAddr2 + &H15) 'The offset the the first attribute
                        BaseAddr2 = BaseAddr2 + MergeToInt(CurrEntryBytes, BaseAddr2 + &H4, BaseAddr2 + &H7) 'Add the length of the attribute to the base address to find the next attribute
                        Try
                            Parent = MergeToInt(CurrEntryBytes, BaseAddr2 + &H18, BaseAddr2 + &H1D)
                        Catch
                        End Try
                        Try
                            If FileSize = 0 Then FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H48, BaseAddr2 + &H4F)
                            If FileSize > 2 ^ 30 Then FileSize = 0
                            'If FileSize = 0 Then FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H40, BaseAddr2 + &H47)
                        Catch
                        End Try
                        Try
                            Name = System.Text.UnicodeEncoding.Unicode.GetString(ByteArrayPart(CurrEntryBytes, BaseAddr2 + &H5A, (BaseAddr2 + &H5A) + ((2 * CurrEntryBytes(BaseAddr2 + &H58)) - 2)))
                        Catch
                        End Try
                        Try
                            If Name.Contains("~") Then
                                BaseAddr2 = BaseAddr2 + MergeToInt(CurrEntryBytes, BaseAddr2 + &H4, BaseAddr2 + &H7) 'Add the length of the attribute to the base address to find the next attribute
                                If FileSize = 0 Then FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H48, BaseAddr2 + &H4F)
                                If FileSize > 2 ^ 30 Then FileSize = 0
                                'If FileSize = 0 Then FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H40, BaseAddr2 + &H47)
                                Name = System.Text.UnicodeEncoding.Unicode.GetString(ByteArrayPart(CurrEntryBytes, BaseAddr2 + &H5A, (BaseAddr2 + &H5A) + ((2 * CurrEntryBytes(BaseAddr2 + &H58)) - 2)))
                            End If
                        Catch
                        End Try
                        If Name.Length >= 75 Then Name = Mid(Name, 1, 74) & Mid(Name, 76, Name.Length - 75)
                        If CheckBox1.Checked Then
                            Try
                                Path = GetFullPath2(Parent, MFTAddress, MFTEntrySize, buffer.BytesPerCluster) & "\" & Name
                            Catch
                            End Try
                        End If
                        If FileSize = 0 Then
                            Try
                                LoopCount = 0
                                While CurrEntryBytes(BaseAddr2) <> &H80 And LoopCount < 5
                                    LoopCount = LoopCount + 1
                                    BaseAddr2 = BaseAddr2 + MergeToInt(CurrEntryBytes, BaseAddr2 + &H4, BaseAddr2 + &H7) 'Add the length of the attribute to the base address to find the next attribute
                                End While
                                'FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H28, BaseAddr2 + &H2F)
                                'If FileSize > 2 ^ 30 Then FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H38, BaseAddr2 + &H3F)
                                If MergeToInt(CurrEntryBytes, BaseAddr2 + &HE, BaseAddr2 + &HF) = 1 Then
                                    'It is recycled (filename at offset 0x30,file size at offset 0x10)
                                    FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H10, BaseAddr2 + &H13)
                                    'Path = ""
                                    'BaseAddr2 = BaseAddr2 + &H30
                                    'While CurrEntryBytes(BaseAddr2) > 0
                                    'Path = Path + ChrW(MergeToInt(CurrEntryBytes, BaseAddr2, BaseAddr2 + 1))
                                    'Path = Path + ChrW(CurrEntryBytes(BaseAddr2))
                                    'BaseAddr2 = BaseAddr2 + 2
                                    'End While
                                Else
                                    'FileSize = 0
                                    FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H30, BaseAddr2 + &H37)
                                End If
                                If FileSize > 2 ^ 30 Then FileSize = 0
                            Catch
                            End Try
                        End If
                        If FileSize > 0 Then
                            With ListView1.Items.Add(Name)
                                If Not Path.Contains("SKIPTHISFILE") Then
                                    .SubItems.Add(Path)
                                Else
                                    .SubItems.Add("")
                                End If
                                .SubItems.Add(FileSize)
                                .SubItems.Add((Record * MFTEntrySize) + (Offset * (buffer.BytesPerCluster / buffer.BytesPerSector)))
                                If CheckBox2.Checked Then
                                    Try
                                        .SubItems.Add(GetFileIntegrity((Record * MFTEntrySize) + (Offset * (buffer.BytesPerCluster / buffer.BytesPerSector)), buffer.BytesPerSector, buffer.BytesPerFileRecordSegment))
                                    Catch
                                        .SubItems.Add("Unknown")
                                    End Try
                                Else
                                    .SubItems.Add("")
                                End If
                                ListView2.Items.Add(.Clone)
                            End With
                        End If
                        GoTo dn
                    End If
                Catch
                End Try
dn:
                Try
                    ProgressBar1.Value = ProgressBar1.Value + 1
                Catch
                End Try
            Next Record
            BaseAddr = BaseAddr + (1 + LenLen + OffLen)
        End While
        ProgressBar1.Value = 0
        ToolStripStatusLabel1.Text = ""
        Button1.Enabled = True
        Button2.Enabled = True
        ComboBox1.Enabled = True
        Button3.Enabled = True
        CheckBox2.Enabled = True
    End Sub

#30
jajaja, siempre pasa, soy alguien que me gusta hacer ejercicio y trato de arreglarme, pero siempre me pasa que cuando alguien me conoce, sale la pregunta...¿a que te dedicas? y cuando les digo, soy informatico, jajaja se me quedan viendo bien raro, y cuando les digo.. ¿que?, ¿me imaginabas gordo, friki y con mis playeras de star wars?... y siempre me dicen que si.. algo asi se esperaban...