diff options
Diffstat (limited to 'src/debug/jdwp/sets/vm.c')
-rw-r--r-- | src/debug/jdwp/sets/vm.c | 109 |
1 files changed, 107 insertions, 2 deletions
diff --git a/src/debug/jdwp/sets/vm.c b/src/debug/jdwp/sets/vm.c index fdb1ec0..d8e3255 100644 --- a/src/debug/jdwp/sets/vm.c +++ b/src/debug/jdwp/sets/vm.c @@ -2,7 +2,7 @@ /* OpenIDA - Outil d'analyse de fichiers binaires * vm.c - constitution des charges utiles liées à la VM * - * Copyright (C) 2010 Cyrille Bagard + * Copyright (C) 2010-2012 Cyrille Bagard * * This file is part of OpenIDA. * @@ -24,9 +24,11 @@ #include "vm.h" +#include <malloc.h> #include <string.h> +#include "../misc/id.h" #include "../misc/types.h" #include "../../../common/endianness.h" @@ -36,6 +38,7 @@ * * * Paramètres : blob = ensemble de données binaires brutes. * * len = quantité de données valides. * +* sizes = références pour la valeur des tailles dynamiques. * * reply = structure de réponse à constituer. [OUT] * * * * Description : Reconstitue une réponse quant à une version de serveur. * @@ -46,7 +49,7 @@ * * ******************************************************************************/ -bool get_jdwp_vm_version(const bin_t *blob, off_t len, jdwp_cmd_vm_version_reply *reply) +bool get_jdwp_vm_version(const bin_t *blob, off_t len, const jdwp_cmd_vm_id_sizes_reply *sizes, jdwp_cmd_vm_version_reply *reply) { bool result; /* Bilan à retourner */ off_t pos; /* Tête de lecture */ @@ -95,3 +98,105 @@ void free_jdwp_vm_version(jdwp_cmd_vm_version_reply *reply) free_jdwp_string(&reply->vm_name); } + + +/****************************************************************************** +* * +* Paramètres : blob = ensemble de données binaires brutes. * +* len = quantité de données valides. * +* sizes = références pour la valeur des tailles dynamiques. * +* reply = structure de réponse à constituer. [OUT] * +* * +* Description : Reconstitue une réponse fournissant la liste des threads. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool get_jdwp_vm_all_threads(const bin_t *blob, off_t len, const jdwp_cmd_vm_id_sizes_reply *sizes, jdwp_cmd_vm_allthreads_reply *reply) +{ + bool result; /* Bilan à retourner */ + off_t pos; /* Tête de lecture */ + uint32_t i; /* Boucle de parcours */ + + pos = 0; + memset(reply, 0, sizeof(jdwp_cmd_vm_id_sizes_reply)); + + result = read_u32(&reply->count, blob, &pos, len, SRE_BIG); + if (!result) return false; + + reply->threads = (jdwp_dynsized_id *)calloc(reply->count, sizeof(jdwp_dynsized_id)); + + for (i = 0; i < reply->count && result; i++) + result = get_jdwp_thread_id(blob, &pos, len, sizes, &reply->threads[i]); + + if (!result) + free_jdwp_all_threads(reply); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : reply = structure de réponse à supprimer de la mémoire. * +* * +* Description : Libère le contenu d'une réponse offrant une liste de threads.* +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void free_jdwp_all_threads(jdwp_cmd_vm_allthreads_reply *reply) +{ + free(reply->threads); + +} + + +/****************************************************************************** +* * +* Paramètres : blob = ensemble de données binaires brutes. * +* len = quantité de données valides. * +* sizes = références pour la valeur des tailles dynamiques. * +* reply = structure de réponse à constituer. [OUT] * +* * +* Description : Reconstitue une réponse quant aux tailles spécifiques. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool get_jdwp_vm_id_sizes(const bin_t *blob, off_t len, const jdwp_cmd_vm_id_sizes_reply *sizes, jdwp_cmd_vm_id_sizes_reply *reply) +{ + bool result; /* Bilan à retourner */ + off_t pos; /* Tête de lecture */ + + pos = 0; + memset(reply, 0, sizeof(jdwp_cmd_vm_id_sizes_reply)); + + result = read_u32(&reply->field_id_size, blob, &pos, len, SRE_BIG); + if (!result) return false; + + result = read_u32(&reply->method_id_size, blob, &pos, len, SRE_BIG); + if (!result) return false; + + result = read_u32(&reply->object_id_size, blob, &pos, len, SRE_BIG); + if (!result) return false; + + result = read_u32(&reply->reference_type_id_size, blob, &pos, len, SRE_BIG); + if (!result) return false; + + result = read_u32(&reply->frame_id_size, blob, &pos, len, SRE_BIG); + if (!result) return false; + + return true; + +} |