Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-05-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Colocar Hardware BreakPoints en Windows x64

Bueno amigos, esto avanza poquito a poquito. Ahora me encuentro con el tema de los Hardware BreakPoints los cuales al pasar el codigo a x64 no funcionan y ademas el programa depurado da una excepcion y se acaba cerrando.
Para ponerlos en x32 tenia estas constantes:
Código PHP:
#define EXCEPTION_GUARD_PAGE_VIOLATION 0x80000001L

enum ModeBPM BMP_WRITEBMP_ACCESS,BMP_EXECUTION};
enum ModeHW HW_WRITEHW_ACCESSHW_EXECUTION};
enum LenHW HW_BYTEHW_WORDHW_DWORD};

//Constantes para los HW
#define HW_DR0        0x1
#define HW_DR1        0x2
#define HW_DR2        0x3
#define HW_DR3        0x4

#define DR0_LOCAL_EXACT_BPM_ENABLED    0x01
#define DR0_GLOBAL_EXACT_BPM_ENABLED   0x02

#define DR0_W      0x10000
#define DR0_IO      0x20000
#define DR0_RW          0x30000
#define DR0_EXECUTION    0x0

#define DR0_LEN1    0x0
#define DR0_LEN2    0x40000
#define DR0_LEN3    0x0C0000

#define DR1_LOCAL_EXACT_BPM_ENABLED  0x4
#define DR1_GLOBAL_EXACT_BPM_ENABLED 0x8

#define DR1_W      0x100000
#define DR1_IO      0x200000
#define DR1_RW      0x300000
#define DR1_EXECUTION          0x0

#define DR1_LEN1    0x0
#define DR1_LEN2    0x400000
#define DR1_LEN3    0x0C00000

#define DR2_LOCAL_EXACT_BPM_ENABLED  0x10
#define DR2_GLOBAL_EXACT_BPM_ENABLED 0x20

#define DR2_W      0x1000000
#define DR2_IO      0x2000000
#define DR2_RW      0x3000000
#define DR2_EXECUTION          0x0

#define DR2_LEN1    0x0
#define DR2_LEN2    0x4000000
#define DR2_LEN3    0x0C000000

#define DR3_LOCAL_EXACT_BPM_ENABLED   0x40
#define DR3_GLOBAL_EXACT_BPM_ENABLED  0x80

#define DR3_W      0x10000000
#define DR3_IO      0x20000000
#define DR3_RW      0x30000000
#define DR3_EXECUTION          0x0

#define DR3_LEN1    0x0
#define DR3_LEN2    0x40000000
#define DR3_LEN3    0x0C0000000

#define LOCAL_EXACT_BPM_ENABLED      0x100
#define LOCAL_EXACT_BPM_DISABLED    0x0
#define GLOBAL_EXACT_BPM_ENABLED    0x200
#define GLOBAL_EXACT_BPM_DISABLED   0x0
#define GENERAL_DETECT_ENABLED      0x2000
#define RESERVED_BIT10              0x400

#define CLEAR_DR0            0x0FFF0FFFC
#define CLEAR_DR1               0x0FF0FFFF3
#define CLEAR_DR2                   0x0F0FFFFCF
#define CLEAR_DR3                   0x0FFFFF3F 
Y esta funcion:
Código PHP:
DWORD __fastcall THiloDebugger::OnSingleStepEventThread(EXCEPTION_DEBUG_INFO *info)
{
    
pBP BPaux;
    
int HWBySingleStep=0;

    
DWORD Aux;

     
/*-------------------------------------------------------------------------------------
    *
    * DEBUG REGISTER 7
    *
    * LEN3 R/W3 LEN2 R/W2 LEN1 R/W1 LEN0 R/W0 0 0 GD 0 0 1 GE LE G3 L3 G2 L2 G1 L1 G0 L0
    *
    *  00   00   00   00   00   00   00   00  0 0 0  0 0 0 0  1  0  1  0  1  0  1  0  1
    *
    *-------------------------------------------------------------------------------------*/

    
if(RepairHW == true){
        switch(
ItemHWRepair.DrW){

            case 
HW_DR0:
                
con.Dr0 ItemHWRepair.Address;
                break;

            case 
HW_DR1:
                
con.Dr1 ItemHWRepair.Address;
                break;

            case 
HW_DR2:
                
con.Dr2 ItemHWRepair.Address;
                break;

            case 
HW_DR3:
                
con.Dr3 ItemHWRepair.Address;
                break;

        }
        
RepairHW false;

        if(
UserStepIn == true){
            
UserStepIn false;

            
DisableBP(0); // Desactivamos todos los BPs para que si el usuario ve la memoria esta se muestre como debe
            
ClearBMP(true); // reponemos las propiedades de la memoria

            
Synchronize(SingleStepInSincronyze);
        }
    }
    else{

        
// Verificamos si la parada fue por un HW
        
if (con.Dr6 1) {
            
HWBySingleStep HW_DR0;
        }
        else if(
con.Dr6 2){
            
HWBySingleStep HW_DR1;
        }
        else if(
con.Dr6 4){
            
HWBySingleStep HW_DR2;
        }
        else if(
con.Dr6 8){
            
HWBySingleStep HW_DR3;
        }

        if (
HWBySingleStep != 0) {
            
UserStepIn false;
            
// el sigle step fue originado por un HW
            
DisableBP(0); // Desactivamos todos los BPs para que si el usuario ve la memoria esta se muestre como debe
            
ClearBMP(true); // reponemos las propiedades de la memoria

            
Aux con.Dr7;
            switch(
HWBySingleStep){

                case 
HW_DR0:
                        
HWAddress con.Dr0;
                        
Aux >>=  16;
                        break;
                case 
HW_DR1:
                        
HWAddress con.Dr1;
                        
Aux >>=  20;
                        break;
                case 
HW_DR2:
                        
HWAddress con.Dr2;
                        
Aux >>= 24;
                        break;
                case 
HW_DR3:
                        
HWAddress con.Dr3;
                        
Aux >>= 28;
                        break;

            }
            
Aux &= 3;
            if( 
Aux == 00){ // por ejecución
                
LastHWMode HW_EXECUTION;
            }
            else if(
Aux ==01){
                
LastHWMode HW_WRITE;
            }
            else{
                
LastHWMode HW_ACCESS;
            }

            
// llamar al usuario
            
Synchronize(HardwareBreakPointSincronyze);


            switch(
HWBySingleStep){

                case 
HW_DR0:

                    if(
con.Dr0 == LastExceptionAddress){ // por ejecución

                        
ItemHWRepair.Address LastExceptionAddress;
                        
ItemHWRepair.DrW HW_DR0;
                        
con.Dr0 0// hay que guardar el dato
                        
RepairHW=true;
                    }
                    break;
                case 
HW_DR1:
                    if(
con.Dr1 == LastExceptionAddress){ // por ejecución

                        
ItemHWRepair.Address LastExceptionAddress;
                        
ItemHWRepair.DrW HW_DR1;

                        
con.Dr1 0// hay que guardar el dato
                        
RepairHWtrue;

                    }
                    break;
                case 
HW_DR2:
                    if(
con.Dr2 == LastExceptionAddress){ // por ejecución

                        
ItemHWRepair.Address LastExceptionAddress;
                        
ItemHWRepair.DrW HW_DR2;

                        
con.Dr2 0// hay que guardar el dato
                        
RepairHWtrue;

                    }
                    break;
                case 
HW_DR3:
                    if(
con.Dr3 == LastExceptionAddress){ // por ejecución

                        
ItemHWRepair.Address LastExceptionAddress;
                        
ItemHWRepair.DrW HW_DR3;

                        
con.Dr3 0// hay que guardar el dato
                        
RepairHWtrue;

                    }
                    break;
            }
            if(
RepairHW== true){
                
SetSingleStep();
            }

        }
        else if( 
UserStepIn == true){
            
UserStepIn false;
            
DisableBP(0); // Desactivamos todos los BPs para que si el usuario ve la memoria esta se muestre como debe
            
ClearBMP(true); // reponemos las propiedades de la memoria

            
Synchronize(SingleStepInSincronyze);

        }

         if(
ItemBMP.Address != NULL){  // La excepción no fue por un BMP
            
SetBMP(ItemBMP.Address,ItemBMP.Size,ItemBMP.Mode);
        }

        
// Reponemos los BPs
        
for(int i=0ListaBPs->Count;i++){
            
BPaux = (TBP*)ListaBPs->Items[i];
            if(
BPaux->estado == false){
                
SetBP(BPaux->dir);
            }
        }
    }
    return 
DBG_CONTINUE// exception continuation


El caso es que no se si los valores a usar en x64 son diferentes a los que se usan en x32. ¿Pueden echarme una mano?
Responder Con Cita
  #2  
Antiguo 27-05-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Pongo un HBP en el EntryPoint y la siguiente excepción que tengo es EXCEPTION_DEBUG_EVENT justo en la siguiente dirección, o sea mi EntryPoint es 0x0000000000403280 y la excepción se produce en 0x0000000000403281 que es justo el siguiente byte del binario. El codigo de error que obtengo es 0x00000000c0000005 que es un EXCEPTION_ACCESS_VIOLATION la pregunta es ¿por que me da ese error justo después del EntryPoint si mi HBP lo tengo puesto en el inicio de MessageBoxW?
No lo entiendo
No para en EXCEPTION_SINGLE_STEP que es donde debería parar para el hbp sino que da la excepción de acceso de violación nada más salir del evento del EntryPoint.
Si no pongo el HBP no da esa excepción 😭
Por favor échenme una mano, si quieren el proyecto para revisarlo... sin problema, es para compartirlo.
Ya no se que más probar, estoy en un punto muerto que no voy ni para atrás .
Responder Con Cita
  #3  
Antiguo 02-06-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Nadie sabría cómo ayudarme con este tema? Es lo único que me falta para terminar 😥
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Duda con los hardware breakpoints aguml C++ Builder 0 15-05-2020 16:41:57
API de Windows para Instalar Hardware Jaguar13 Windows 1 03-11-2010 20:07:45
Obtener información de hardware a través de API's de Windows (no componentes) n3mohack API de Windows 7 15-10-2010 13:21:12
Breakpoints fantasma Delfin Varios 4 21-06-2010 22:56:31
Tipos de Breakpoints senda Varios 2 18-06-2007 18:41:34


La franja horaria es GMT +2. Ahora son las 22:04:20.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi