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

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-05-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 12
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
 



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 00:30:21.


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