radare2/shlr/wind/kd.h
2014-12-07 19:32:45 +01:00

176 lines
4.1 KiB
C

// Copyright (c) 2014, The Lemon Man, All rights reserved.
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 3.0 of the License, or (at your option) any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
// You should have received a copy of the GNU Lesser General Public
// License along with this library.
// Some documentation of the data structures has been kindly ripped off ReactOS project.
#ifndef KD_H
#define KD_H
enum {
KD_E_OK = 0,
KD_E_BADCHKSUM = -1,
KD_E_TIMEOUT = -2,
KD_E_MALFORMED = -3,
KD_E_IOERR = -4,
};
#define KD_PACKET_DATA 0x30303030
#define KD_PACKET_CTRL 0x69696969
#define KD_MAX_PAYLOAD 0x800
#define KD_PACKET_TYPE_MANIP 2
#define KD_PACKET_TYPE_ACK 4
#define KD_PACKET_TYPE_RESEND 5
#define KD_PACKET_TYPE_RESET 6
#define KD_PACKET_TYPE_STATE_CHANGE 7
#define KD_PACKET_TYPE_IO 11
// http://msdn.microsoft.com/en-us/library/cc704588.aspx
#define KD_RET_OK 0x00000000
#define KD_RET_ERR 0xC0000001
#define KD_RET_ENOENT 0xC000000F
#define KD_DBG_CONT 0x00010001
#define KD_MACH_I386 0x014C
#define KD_MACH_IA64 0x0200
#define KD_MACH_AMD64 0x8664
#define KD_MACH_ARM 0x01c0
#define KD_MACH_EBC 0x0EBC
#define DBGKD_VERS_FLAG_DATA 0x0002
#define DBGKD_VERS_FLAG_PTR64 0x0004
typedef struct kd_req_t {
uint32_t req;
uint16_t cpu_level;
uint16_t cpu;
uint32_t ret;
// Pad to 16-byte boundary (?)
uint32_t pad;
union {
struct {
uint64_t addr;
uint32_t length;
uint32_t read;
} __attribute__((packed)) r_mem;
struct {
uint16_t major;
uint16_t minor;
uint8_t proto_major;
uint8_t proto_minor;
uint16_t flags;
uint16_t machine;
uint8_t misc[6];
uint64_t kernel_base;
uint64_t mod_addr;
uint64_t dbg_addr;
} __attribute__((packed)) r_ver;
struct {
uint32_t reason;
uint32_t tf;
uint32_t dr7;
uint32_t css;
uint32_t cse;
} r_cont;
struct {
uint64_t addr;
uint32_t handle;
} r_set_bp;
struct {
uint32_t handle;
} r_del_bp;
struct {
uint64_t addr;
uint32_t flags;
} r_set_ibp;
struct {
uint64_t addr;
uint32_t flags;
uint32_t calls;
} r_get_ibp;
struct {
uint32_t flags;
} r_ctx;
struct {
uint64_t addr;
uint64_t reserved;
uint32_t address_space;
uint32_t flags;
} r_query_mem;
// Pad the struct to 56 bytes
uint8_t raw[40];
};
uint8_t data[0];
} __attribute__((packed)) kd_req_t;
#define KD_EXC_BKPT 0x80000003
typedef struct kd_stc_64 {
uint32_t state;
uint16_t cpu_level;
uint16_t cpu;
uint32_t cpu_count;
uint32_t pad1;
uint64_t kthread;
uint64_t pc;
union {
struct {
uint32_t code;
uint32_t flags;
uint64_t ex_record;
uint64_t ex_addr;
} __attribute__((packed)) exception;
};
} __attribute__((packed)) kd_stc_64;
typedef struct kd_ioc_t {
uint32_t req;
uint32_t ret;
uint64_t pad[7];
} kd_ioc_t;
typedef struct kd_packet_t {
uint32_t leader;
uint16_t type;
uint16_t length;
uint32_t id;
uint32_t checksum;
uint8_t data[0];
} __attribute__((packed)) kd_packet_t;
// Compile time assertions macros taken from :
// http://www.pixelbeat.org/programming/gcc/static_assert.html
#define ASSERT_CONCAT_(a, b) a##b
#define ASSERT_CONCAT(a, b) ASSERT_CONCAT_(a, b)
#define ct_assert(e) enum { ASSERT_CONCAT(assert_line_, __LINE__) = 1/(!!(e)) }
ct_assert(sizeof(kd_packet_t)==16);
ct_assert(sizeof(kd_req_t)==56);
ct_assert(sizeof(kd_ioc_t)==64);
int kd_send_ctrl_packet (void *fp, const uint32_t type, const uint32_t id);
int kd_send_data_packet (void *fp, const uint32_t type, const uint32_t id, const uint8_t *req, const int req_len, const uint8_t *buf, const uint32_t buf_len);
int kd_read_packet (void *fp, kd_packet_t **p);
int kd_packet_is_valid (const kd_packet_t *p);
int kd_packet_is_ack (const kd_packet_t *p);
uint32_t kd_data_checksum (const uint8_t *buf, const uint64_t buf_len);
#endif