/*
* main.cpp
*
* Created on: Apr 2, 2011
* Author: masa
*/
#include
<iostream>
#include
<string>
using
namespace
std
;
extern
"C"
{
void
dumpStack32(
void
*,
int
);
}
void
foo(
int
,
int
);
void
boo();
unsigned
long
*org_ptr;
int
offset =
4
;
int
main(){
foo
(
1
,
2
);
return
0
;
}
void
dumpStack32(
void
* ptr,
int
counts) {
unsigned
long
*ulong_ptr = (
unsigned
long
*)ptr;
printf
(
"---------------------\n"
);
printf
(
" address | long var \n"
);
printf
(
"---------------------\n"
);
for
(
int
i=
0
; i<counts; i++)
printf
(
" %08x| %08x \n"
, &ulong_ptr[i], (
unsigned
int
)ulong_ptr[i]);
printf
(
"-----------------------------------------\n"
);
}
void
foo(
int
a,
int
b) {
int
c = a + b;
cout
<<
"Sum is :"
<< c <<
endl
;
dumpStack32
(&c,
15
);
unsigned
long
*ulong_ptr = (
unsigned
long
*)&a;
printf
(
" %08x\n"
, *(ulong_ptr+
offset
));
org_ptr
= (
unsigned
long
*)*(ulong_ptr+
offset
);
printf
(
"main's address %08x"
, (
unsigned
long
)(&
main
));
*(ulong_ptr+
offset
) = (
long
unsigned
int
)&
boo
;
}
void
boo(){
int
c =
5
;
cout
<<
endl
<<
"Boo!"
<<
endl
;
unsigned
long
*ulong_ptr = (
unsigned
long
*)&c;
printf
(
" %08x"
, *(ulong_ptr+
2
));
printf
(
" org = %08x"
,
org_ptr
);
*(ulong_ptr+
2
) = (
long
unsigned
int
)
org_ptr
;
dumpStack32
(&c,
10
);
}