Module ida_segment
IDA requires that all program addresses belong to segments (each address must belong to exactly one segment). The situation when an address doesn't belong to any segment is allowed as a temporary situation only when the user changes program segmentation. Bytes outside a segment can't be converted to instructions, have names, comments, etc. Each segment has its start address, ending address and represents a contiguous range of addresses. There might be unused holes between segments.
Each segment has its unique segment selector. This selector is used to distinguish the segment from other segments. For 16-bit programs the selector is equal to the segment base paragraph. For 32-bit programs there is special array to translate the selectors to the segment base paragraphs. A selector is a 32/64 bit value.
The segment base paragraph determines the offsets in the segment. If the start address of the segment == (base << 4) then the first offset in the segment will be 0. The start address should be higher or equal to (base << 4). We will call the offsets in the segment 'virtual addresses'. So, the virtual address of the first byte of the segment is
(start address of segment - segment base linear address)
For IBM PC, the virtual address corresponds to the offset part of the address. For other processors (Z80, for example), virtual addresses correspond to Z80 addresses and linear addresses are used only internally. For MS Windows programs the segment base paragraph is 0 and therefore the segment virtual addresses are equal to linear addresses.
Global Variables
ADDSEG_FILLGAP
ADDSEG_IDBENC
ADDSEG_NOAA
ADDSEG_NOSREG
ADDSEG_NOTRUNC
ADDSEG_OR_DIE
ADDSEG_QUIET
ADDSEG_SPARSE
CSS_BREAK
CSS_NODBG
CSS_NOMEM
CSS_NORANGE
CSS_OK
MAX_GROUPS
MAX_SEGM_TRANSLATIONS
MOVE_SEGM_CHUNK
MOVE_SEGM_DEBUG
MOVE_SEGM_IDP
MOVE_SEGM_INVAL
MOVE_SEGM_LOADER
MOVE_SEGM_MAPPING
MOVE_SEGM_ODD
MOVE_SEGM_OK
MOVE_SEGM_ORPHAN
MOVE_SEGM_PARAM
MOVE_SEGM_ROOM
MOVE_SEGM_SOURCEFILES
MSF_FIXONCE
MSF_LDKEEP
MSF_NETNODES
MSF_NOFIX
MSF_PRIORITY
MSF_SILENT
SEGMOD_KEEP
SEGMOD_KEEP0
SEGMOD_KEEPSEL
SEGMOD_KILL
SEGMOD_NOMOVE
SEGMOD_SILENT
SEGMOD_SPARSE
SEGPERM_EXEC
SEGPERM_MAXVAL
SEGPERM_READ
SEGPERM_WRITE
SEG_ABSSYM
SEG_BSS
SEG_CODE
SEG_COMM
SEG_DATA
SEG_GRP
SEG_IMEM
SEG_IMP
SEG_MAX_BITNESS_CODE
SEG_MAX_SEGTYPE_CODE
SEG_NORM
SEG_NULL
SEG_UNDF
SEG_XTRN
SFL_COMORG
SFL_DEBUG
SFL_HEADER
SFL_HIDDEN
SFL_HIDETYPE
SFL_LOADER
SFL_OBOK
SNAP_ALL_SEG
SNAP_CUR_SEG
SNAP_LOAD_SEG
SREG_NUM
saAbs
saGroup
saRel1024Bytes
saRel128Bytes
saRel2048Bytes
saRel32Bytes
saRel4K
saRel512Bytes
saRel64Bytes
saRelByte
saRelDble
saRelPage
saRelPara
saRelQword
saRelWord
saRel_MAX_ALIGN_CODE
scCommon
scGroup
scPriv
scPub
scPub2
scPub3
scStack
sc_MAX_COMB_CODE
Functions
add_segm(para: ea_t, start: ea_t, end: ea_t, name: char const *, sclass: char const *, flags: int = 0) ‑> bool
add_segm(para, start, end, name, sclass, flags=0) -> bool Add a new segment, second form. Segment alignment is set to saRelByte. Segment combination is "public" or "stack" (if segment class is "STACK"). Addressing mode of segment is taken as default (16bit or 32bit). Default segment registers are set to BADSEL. If a segment already exists at the specified range of addresses, this segment will be truncated. Instructions and data in the old segment will be deleted if the new segment has another addressing mode or another segment base address.
"CODE" -> SEG_CODE
"DATA" -> SEG_DATA
"CONST" -> SEG_DATA
"STACK" -> SEG_BSS
"BSS" -> SEG_BSS
"XTRN" -> SEG_XTRN
"COMM" -> SEG_COMM
"ABS" -> SEG_ABSSYM flags: (C++: int) Add segment flags retval 1: ok retval 0: failed, a warning message is displayed
add_segm_ex(NONNULL_s: segment_t, name: char const *, sclass: char const *, flags: int) ‑> bool
add_segm_ex(NONNULL_s, name, sclass, flags) -> bool Add a new segment. If a segment already exists at the specified range of addresses, this segment will be truncated. Instructions and data in the old segment will be deleted if the new segment has another addressing mode or another segment base address.
add_segment_translation(segstart: ea_t, mappedseg: ea_t) ‑> bool
add_segment_translation(segstart, mappedseg) -> bool Add segment translation.
allocate_selector(segbase: ea_t) ‑> sel_t
allocate_selector(segbase) -> sel_t Allocate a selector for a segment unconditionally. You must call this function before calling add_segm_ex(). add_segm() calls this function itself, so you don't need to allocate a selector. This function will allocate a new free selector and setup its mapping using find_free_selector() and set_selector() functions.
change_segment_status(s: segment_t, is_deb_segm: bool) ‑> int
change_segment_status(s, is_deb_segm) -> int Convert a debugger segment to a regular segment and vice versa. When converting debug->regular, the memory contents will be copied to the database.
del_segm(ea: ea_t, flags: int) ‑> bool
del_segm(ea, flags) -> bool Delete a segment.
del_segment_translations(segstart: ea_t) ‑> void
del_segment_translations(segstart) Delete the translation list
del_selector(selector: sel_t) ‑> void
del_selector(selector) Delete mapping of a selector. Be wary of deleting selectors that are being used in the program, this can make a mess in the segments.
find_free_selector() ‑> sel_t
find_free_selector() -> sel_t Find first unused selector.
find_selector(base: ea_t) ‑> sel_t
find_selector(base) -> sel_t Find a selector that has mapping to the specified paragraph.
get_defsr(s: segment_t, reg: int) ‑> sel_t
get_defsr(s, reg) -> sel_t Deprecated, use instead: value = s.defsr[reg]
get_first_seg() ‑> segment_t *
get_first_seg() -> segment_t Get pointer to the first segment.
get_group_selector(grpsel: sel_t) ‑> sel_t
get_group_selector(grpsel) -> sel_t Get common selector for a group of segments.
get_last_seg() ‑> segment_t *
get_last_seg() -> segment_t Get pointer to the last segment.
get_next_seg(ea: ea_t) ‑> segment_t *
get_next_seg(ea) -> segment_t Get pointer to the next segment.
get_prev_seg(ea: ea_t) ‑> segment_t *
get_prev_seg(ea) -> segment_t Get pointer to the previous segment.
get_segm_base(s: segment_t) ‑> ea_t
get_segm_base(s) -> ea_t Get segment base linear address. Segment base linear address is used to calculate virtual addresses. The virtual address of the first byte of the segment will be (start address of segment - segment base linear address)
get_segm_by_name(name: char const *) ‑> segment_t *
get_segm_by_name(name) -> segment_t Get pointer to segment by its name. If there are several segments with the same name, returns the first of them.
get_segm_by_sel(selector: sel_t) ‑> segment_t *
get_segm_by_sel(selector) -> segment_t Get pointer to segment structure. This function finds a segment by its selector. If there are several segments with the same selectors, the last one will be returned.
get_segm_class(s: segment_t) ‑> qstring *
get_segm_class(s) -> str Get segment class. Segment class is arbitrary text (max 8 characters).
get_segm_name(s: segment_t, flags: int = 0) ‑> qstring *
get_segm_name(s, flags=0) -> ssize_t Get true segment name by pointer to segment.
get_segm_num(ea: ea_t) ‑> int
get_segm_num(ea) -> int Get number of segment by address.
get_segm_para(s: segment_t) ‑> ea_t
get_segm_para(s) -> ea_t Get segment base paragraph. Segment base paragraph may be converted to segment base linear address using to_ea() function. In fact, to_ea(get_segm_para(s), 0) == get_segm_base(s).
get_segm_qty() ‑> int
get_segm_qty() -> int Get number of segments.
get_segment_alignment(align: uchar) ‑> char const *
get_segment_alignment(align) -> char const * Get text representation of segment alignment code.
get_segment_cmt(s: segment_t, repeatable: bool) ‑> qstring *
get_segment_cmt(s, repeatable) -> str Get segment comment.
get_segment_combination(comb: uchar) ‑> char const *
get_segment_combination(comb) -> char const * Get text representation of segment combination code.
get_segment_translations(transmap: eavec_t *, segstart: ea_t) ‑> ssize_t
get_segment_translations(transmap, segstart) -> ssize_t Get segment translation list.
get_selector_qty() ‑> size_t
get_selector_qty() -> size_t Get number of defined selectors.
get_visible_segm_name(s: segment_t) ‑> qstring *
get_visible_segm_name(s) -> str Get segment name by pointer to segment.
getn_selector(n: int) ‑> sel_t *, ea_t *
getn_selector(n) -> bool Get description of selector (0..get_selector_qty()-1)
getnseg(n: int) ‑> segment_t *
getnseg(n) -> segment_t Get pointer to segment by its number. @warning: Obsoleted because it can slow down the debugger (it has to refresh the whole memory segmentation to calculate the correct answer)
getseg(ea: ea_t) ‑> segment_t *
getseg(ea) -> segment_t Get pointer to segment by linear address.
is_finally_visible_segm(s: segment_t) ‑> bool
is_finally_visible_segm(s) -> bool See SFL_HIDDEN, SCF_SHHID_SEGM.
is_miniidb() ‑> bool
is_miniidb() -> bool Is the database a miniidb created by the debugger?.
is_segm_locked(segm: segment_t) ‑> bool
is_segm_locked(segm) -> bool Is a segment pointer locked?
is_spec_ea(ea: ea_t) ‑> bool
is_spec_ea(ea) -> bool Does the address belong to a segment with a special type?. (SEG_XTRN, SEG_GRP, SEG_ABSSYM, SEG_COMM)
is_spec_segm(seg_type: uchar) ‑> bool
is_spec_segm(seg_type) -> bool Has segment a special type?. (SEG_XTRN, SEG_GRP, SEG_ABSSYM, SEG_COMM)
is_visible_segm(s: segment_t) ‑> bool
is_visible_segm(s) -> bool See SFL_HIDDEN.
lock_segm(segm: segment_t, lock: bool) ‑> void
lock_segm(segm, lock) Lock segment pointer Locked pointers are guaranteed to remain valid until they are unlocked. Ranges with locked pointers cannot be deleted or moved.
move_segm(s: segment_t, to: ea_t, flags: int = 0) ‑> move_segm_code_t
move_segm(s, to, flags=0) -> move_segm_code_t This function moves all information to the new address. It fixes up address sensitive information in the kernel. The total effect is equal to reloading the segment to the target address. For the file format dependent address sensitive information, loader_t::move_segm is called. Also IDB notification event idb_event::segm_moved is called.
move_segm_start(ea: ea_t, newstart: ea_t, mode: int) ‑> bool
move_segm_start(ea, newstart, mode) -> bool Move segment start. The main difference between this function and set_segm_start() is that this function may expand the previous segment while set_segm_start() never does it. So, this function allows to change bounds of two segments simultaneously. If the previous segment and the specified segment have the same addressing mode and segment base, then instructions and data are not destroyed - they simply move from one segment to another. Otherwise all instructions/data which migrate from one segment to another are destroyed. note: this function never disables addresses.
0: if it is necessary to destroy defined items, display a dialog box and ask confirmation
1: if it is necessary to destroy defined items, just destroy them without asking the user
-1: if it is necessary to destroy defined items, don't destroy them (i.e. function will fail)
-2: don't destroy defined items (function will succeed) retval 1: ok retval 0: failed, a warning message is displayed
move_segm_strerror(code: move_segm_code_t) ‑> char const *
move_segm_strerror(code) -> char const * Return string describing error MOVE_SEGM_... code.
rebase_program(delta: PyObject *, flags: int) ‑> int
rebase_program(delta, flags) -> int Rebase the whole program by 'delta' bytes.
segm_adjust_diff(s: segment_t, delta: adiff_t) ‑> adiff_t
segm_adjust_diff(s, delta) -> adiff_t Truncate and sign extend a delta depending on the segment.
segm_adjust_ea(s: segment_t, ea: ea_t) ‑> ea_t
segm_adjust_ea(s, ea) -> ea_t Truncate an address depending on the segment.
segtype(ea: ea_t) ‑> uchar
segtype(ea) -> uchar Get segment type.
sel2ea(selector: sel_t) ‑> ea_t
sel2ea(selector) -> ea_t Get mapping of a selector as a linear address.
sel2para(selector: sel_t) ‑> ea_t
sel2para(selector) -> ea_t Get mapping of a selector.
set_defsr(s: segment_t, reg: int, value: sel_t) ‑> void
set_defsr(s, reg, value) Deprecated, use instead: s.defsr[reg] = value
set_group_selector(grp: sel_t, sel: sel_t) ‑> int
set_group_selector(grp, sel) -> int Create a new group of segments (used OMF files).
0 too many groups (see MAX_GROUPS)
set_segm_addressing(s: segment_t, bitness: size_t) ‑> bool
set_segm_addressing(s, bitness) -> bool Change segment addressing mode (16, 32, 64 bits). You must use this function to change segment addressing, never change the 'bitness' field directly. This function will delete all instructions, comments and names in the segment
2: 64bit segment
1: 32bit segment
0: 16bit segment return: success
set_segm_base(s: segment_t, newbase: ea_t) ‑> bool
set_segm_base(s, newbase) -> bool Internal function.
set_segm_class(s: segment_t, sclass: char const *, flags: int = 0) ‑> int
set_segm_class(s, sclass, flags=0) -> int Set segment class.
"CODE" -> SEG_CODE
"DATA" -> SEG_DATA
"STACK" -> SEG_BSS
"BSS" -> SEG_BSS
if "UNK" then segment type is reset to SEG_NORM. flags: (C++: int) Add segment flags retval 1: ok, name is good and segment is renamed retval 0: failure, name is nullptr or bad or segment is nullptr
set_segm_end(ea: ea_t, newend: ea_t, flags: int) ‑> bool
set_segm_end(ea, newend, flags) -> bool Set segment end address. The next segment is shrinked to allow expansion of the specified segment. The kernel might even delete the next segment if necessary. The kernel will ask the user for a permission to destroy instructions or data going out of segment scope if such instructions exist.
set_segm_name(s: segment_t, name: char const *, flags: int = 0) ‑> int
set_segm_name(s, name, flags=0) -> int Rename segment. The new name is validated (see validate_name). A segment always has a name. If you hadn't specified a name, the kernel will assign it "seg###" name where ### is segment number.
set_segm_start(ea: ea_t, newstart: ea_t, flags: int) ‑> bool
set_segm_start(ea, newstart, flags) -> bool Set segment start address. The previous segment is trimmed to allow expansion of the specified segment. The kernel might even delete the previous segment if necessary. The kernel will ask the user for a permission to destroy instructions or data going out of segment scope if such instructions exist.
set_segment_cmt(s: segment_t, cmt: char const *, repeatable: bool) ‑> void
set_segment_cmt(s, cmt, repeatable) Set segment comment.
'). maximal size is 4096 bytes. Use empty str ("") to delete comment repeatable: (C++: bool) 0: set regular comment. 1: set repeatable comment.
set_segment_translations(segstart: ea_t, transmap: eavec_t const &) ‑> bool
set_segment_translations(segstart, transmap) -> bool Set new translation list.
set_selector(selector: sel_t, paragraph: ea_t) ‑> int
set_selector(selector, paragraph) -> int Set mapping of selector to a paragraph. You should call this function before creating a segment which uses the selector, otherwise the creation of the segment will fail.
if selector == BADSEL, then return 0 (fail)
if the selector has had a mapping, old mapping is destroyed
if the selector number is equal to paragraph value, then the mapping is destroyed because we don't need to keep trivial mappings. paragraph: (C++: ea_t) paragraph to map selector retval 1: ok retval 0: failure (bad selector or too many mappings)
set_visible_segm(s: segment_t, visible: bool) ‑> void
set_visible_segm(s, visible) See SFL_HIDDEN.
setup_selector(segbase: ea_t) ‑> sel_t
setup_selector(segbase) -> sel_t Allocate a selector for a segment if necessary. You must call this function before calling add_segm_ex(). add_segm() calls this function itself, so you don't need to allocate a selector. This function will allocate a selector if 'segbase' requires more than 16 bits and the current processor is IBM PC. Otherwise it will return the segbase value.
std_out_segm_footer(ctx: outctx_t &, seg: segment_t) ‑> void
std_out_segm_footer(ctx, seg) Generate segment footer line as a comment line. This function may be used in IDP modules to generate segment footer if the target assembler doesn't have 'ends' directive.
take_memory_snapshot(type: int) ‑> bool
take_memory_snapshot(type) -> bool Take a memory snapshot of the running process.
update_segm(s: segment_t) ‑> bool
update_segm(s) -> bool
Classes
lock_segment(_segm: segment_t)
: Proxy of C++ lock_segment class.
segment_defsr_array(data: unsigned long long (&)[SREG_NUM])
: Proxy of C++ wrapped_array_t< sel_t,SREG_NUM > class.
Instance variables
bytes: bytevec_t
_get_bytes(self) -> bytevec_t
data: unsigned long long (&)[SREG_NUM]
data
segment_t()
: Proxy of C++ segment_t class.
Ancestors (in MRO)
Instance variables
align: uchar
align
bitness: uchar
bitness
color: bgcolor_t
color
comb: uchar
comb
defsr: wrapped_array_t< sel_t,SREG_NUM >
__getDefsr(self) -> segment_defsr_array
flags: ushort
flags
name: uval_t
name
orgbase: uval_t
orgbase
perm: uchar
perm
sclass: uval_t
sclass
sel: sel_t
sel
type: uchar
type
Methods
abits(self) ‑> int abits(self) -> int Get number of address bits.
abytes(self) ‑> int abytes(self) -> int Get number of address bytes.
clr_comorg(self) ‑> void clr_comorg(self)
clr_ob_ok(self) ‑> void clr_ob_ok(self)
comorg(self) ‑> bool comorg(self) -> bool
is_16bit(self) ‑> bool is_16bit(self) -> bool Is a 16-bit segment?
is_32bit(self) ‑> bool is_32bit(self) -> bool Is a 32-bit segment?
is_64bit(self) ‑> bool is_64bit(self) -> bool Is a 64-bit segment?
is_header_segm(self) ‑> bool is_header_segm(self) -> bool
is_hidden_segtype(self) ‑> bool is_hidden_segtype(self) -> bool
is_loader_segm(self) ‑> bool is_loader_segm(self) -> bool
is_visible_segm(self) ‑> bool is_visible_segm(self) -> bool
ob_ok(self) ‑> bool ob_ok(self) -> bool
set_comorg(self) ‑> void set_comorg(self)
set_debugger_segm(self, debseg: bool) ‑> void set_debugger_segm(self, debseg)
debseg: bool
set_header_segm(self, on: bool) ‑> void set_header_segm(self, on)
on: bool
set_hidden_segtype(self, hide: bool) ‑> void set_hidden_segtype(self, hide)
hide: bool
set_loader_segm(self, ldrseg: bool) ‑> void set_loader_segm(self, ldrseg)
ldrseg: bool
set_ob_ok(self) ‑> void set_ob_ok(self)
set_visible_segm(self, visible: bool) ‑> void set_visible_segm(self, visible)
visible: bool
update(self) ‑> bool update(self) -> bool Update segment information. You must call this function after modification of segment characteristics. Note that not all fields of segment structure may be modified directly, there are special functions to modify some fields.
return: success
use64(self) ‑> bool is_64bit(self) -> bool Is a 64-bit segment?
Last updated