Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-05-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Pues pasa algo raro, aunque al poner el punto no me ofrece ninguno de los miembros que forman parte de la estructura, si lo pongo yo si lo acepta así que guiándome de esa estructura estoy corrigiendo todo lo que pueda pero en algunos puntos me veo que no puedo porque no se para que son algunos de ellos y a que equivalían en x32 para modificar sus respectivos métodos de x32 y convertirlos a x64.
Por ejemplo:
Código PHP:
void THiloDebugger::SetEAX(DWORD Valor)
{
        
con.Eax = Valor;
} 
Quedó así:
Código PHP:
void THiloDebugger::SetRAX(DWORD64 Valor)
{
        
con.Rax = Valor;
} 
Las de los Flags,Drx (los de los Hardware Breakpoints), ContextFlags, los SegXs no hay problema porque coinciden con los de x32.
Del resto no tengo ni idea de para que son y como leerlos y escribirlos y que utilidad podría tener leerlos o escribirlos.
Responder Con Cita
  #2  
Antiguo 20-05-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
He conseguido encontrar info por la red y he reajustado todo para que me lea los registros de x64 (o eso creo porque eso está aun por ver) pero ahora tengo un problema y es que en el de x32 usaba EnumProcessModules para cuando me atacheo a un proceso poder saber las dlls que tenia cargadas el proceso y al cambiar a x64 vi que en la msdn dice que hay que usar EnumProcessModulesEx y el problema que tengo es que me da un error sobre la libreria psapi.lib:
Cita:
[ilink64 Error] Fatal: Invalid object file 'C:\USERS\AGUSTIN\DESKTOP\PROYECTO TDEBUGGER CON C++BUILDER 10.3 RIO X64\CLASE TDEBUGGER\PSAPI.LIB'
En x32 no fallaba esa libreria
¿Alguna idea?

Última edición por Casimiro Noteví fecha: 21-05-2020 a las 00:26:52.
Responder Con Cita
  #3  
Antiguo 21-05-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Arreglado eso también. lo tenía como:
Código PHP:
#pragma comment(lib,"psapi.lib") 
y lo dejé como:
Código PHP:
#pragma comment(lib,"psapi") 
por lo que he podido leer, en x64 se usan las librerías con extensión .a y no .lib y por eso me daba el problema. Poniéndolo como lo tengo ahora he leído que elige la que mejor se adapta, o sea que es mas portable.
Ahora mismo ya compila y me queda lo mas duro, comprobar todo y reparar fallos.
Responder Con Cita
  #4  
Antiguo 21-05-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Ahora tengo otro problema, no me lee el CONTEXT. Lo tengo asi:
Código PHP:
CONTEXT con;
...
...
...
con.ContextFlags= CONTEXT_FULL | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS;
if(
GetThreadContext(CurrentExceptionThread, &con)==0){
    
ShowMessage(WideString().sprintf(L"Error: %i",GetLastError()));
    
salir=true;
} 
Y me muestra el error 998 que según la lista es ERROR_NOACCESS. ¿Que hago mal para que no me funcione?
Para crear el proceso lo tengo así:
Código PHP:
STARTUPINFO si;
PROCESS_INFORMATION pi;
...
...
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
CreateProcess(PathFile.c_bstr(),NULL, NULL, NULL, FALSE, DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS, NULL, NULL, &si, &pi); 

Última edición por aguml fecha: 21-05-2020 a las 17:47:58.
Responder Con Cita
  #5  
Antiguo 21-05-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
He visto un poco el código de Titán enginer y veo que inicializa de forma diferente CONTEXT:
Código PHP:
DBGContext.ContextFlags = CONTEXT_ALL | CONTEXT_FLOATING_POINT | CONTEXT_EXTENDED_REGISTERS; 
Y para crear el proceso lo hace así:
Código PHP:
__declspec(dllexport) void* TITCALL InitDebugW(wchar_t* szFileName, wchar_t* szCommandLine, wchar_t* szCurrentFolder)
{
    
int DebugConsoleFlag = NULL;

    if(
DebugDebuggingDLL)
    {
        
DebugConsoleFlag = CREATE_NO_WINDOW | CREATE_SUSPENDED;
    }
    else if(
engineRemoveConsoleForDebugee)
    {
        
DebugConsoleFlag = CREATE_NO_WINDOW;
    }

    if(
engineEnableDebugPrivilege)
    {
        
EngineSetDebugPrivilege(GetCurrentProcess(), true);
        
DebugRemoveDebugPrivilege = true;
    }
    
wchar_t* szFileNameCreateProcess;
    
wchar_t* szCommandLineCreateProcess;
    
std::wstring createWithCmdLine;
    if(
szCommandLine == NULL || !lstrlenW(szCommandLine))
    {
        
szCommandLineCreateProcess = 0;
        
szFileNameCreateProcess = szFileName;
    }
    else
    {
        
createWithCmdLine.push_back('\"');
        
createWithCmdLine.append(szFileName);
        
createWithCmdLine.push_back('\"');
        
createWithCmdLine.push_back(' ');
        
createWithCmdLine.append(szCommandLine);
        
szCommandLineCreateProcess = (wchar_t*)createWithCmdLine.c_str();
        
szFileNameCreateProcess = 0;
    }
    if(
CreateProcessW(szFileNameCreateProcess, szCommandLineCreateProcess, NULL, NULL, false, DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS | DebugConsoleFlag | CREATE_NEW_CONSOLE, NULL, szCurrentFolder, &dbgStartupInfo, &dbgProcessInformation))
    {
        if(
engineEnableDebugPrivilege)
            
EngineSetDebugPrivilege(GetCurrentProcess(), false);
        
DebugAttachedToProcess = false;
        
DebugAttachedProcessCallBack = NULL;
        return &
dbgProcessInformation;
    }
    else
    {
        
DWORD lastError = GetLastError();
        if(
engineEnableDebugPrivilege)
        {
            
EngineSetDebugPrivilege(GetCurrentProcess(), false);
            
DebugRemoveDebugPrivilege = false;
        }
        
memset(&dbgProcessInformation, 0, sizeof(PROCESS_INFORMATION));
        
SetLastError(lastError);
        return 
0;
    }
} 
Veo que le da o le quita privilegios justo después de crear el proceso.
Responder Con Cita
  #6  
Antiguo 21-05-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Veo que tanto para enviar cómo leer el context suspende antes el thread y después lo revive:
Código PHP:
    if(SuspendThread(hActiveThread) == (DWORD) - 1)
        return 
false;

    
returnf = _GetFullContextDataEx(hActiveThread, titcontext, true);

    
ResumeThread(hActiveThread); 
Podría ser por eso que me deniegue el acceso ¿verdad?
Responder Con Cita
  #7  
Antiguo 23-05-2020
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 14
aguml Va por buen camino
Bueno, después de mucho investigar he conseguido aprender cómo configurar el proyecto para que se lance como administrador y así poder obtener privilegios de depurador después y he estado haciendo pruebas y buscando información sobre el context. Sé que tiene que alinearse a 16 bytes y en winnt.h tengo esto:

Código PHP:
typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
...
... 
Yo después declaro así:
CONTEXT con;
¿Tengo que hacer algo más para que esté bien alineada? A todas las personas que le pasó era por el tema de la alineación de la estructura pero o eran en otro lenguaje o no especifican como arreglaron esto.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Aportación del código de un stored procedure para conversión literal de números birmain Firebird e Interbase 12 16-07-2015 20:12:29
Problemas con el codigo SQL Vales08 SQL 26 13-01-2012 04:05:46
Conversión de código altp .NET 2 10-06-2008 13:22:36
problemas de conversión a PDF con ReportBuilder y TExtraDevices agustibaldo Impresión 10 06-07-2007 15:52:41
problemas de conversion... User_baja1 Varios 2 30-08-2005 14:45:58


La franja horaria es GMT +2. Ahora son las 14:10:25.


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