当我尝试将declspec(裸)函数调用到另一个函数时,我收到错误 根据函数原型,它必须返回一个值但是 当我尝试返回一个值时,我得到另一个错误,说裸函数无法返回值。
__declspec(naked) void bar() {
__asm {
nop
ret
}
}
__declspec(naked) NTSTATUS WINAPI foo(int a, int b) {
bar();
return NTSTATUS(1);
}
所有这一切都是合理的,因为裸函数不会为函数创建堆栈帧 除非程序员明确地创建一个堆栈帧,否则调用另一个函数是一个错误。 但是,当我尝试创建一个堆栈框并以正确的方式进行堆栈对齐时,我收到错误。
如何正确地从裸体功能呼叫到另一个功能?
答案 0 :(得分:3)
裸体功能don't support return statements
以下规则和限制适用于裸体功能:
- 不允许使用return语句。
你应该自己处理堆栈框架和返回值,例如
__declspec( naked ) void bar() {
__asm {
nop
ret
}
}
__declspec(naked) bool foo(int a, int b) {
bar();
__asm {
mov al,1
ret
}
}
int main() {
bool return_value = foo(2, 2);
std::cout << return_value; // 1
}
答案 1 :(得分:0)
裸功能意味着编译器不会为您编写序言(设置esp和ebp)和结尾(重置esp和ebp)。由于编译器没有编写结尾语,因此您不能要求它使用“return”关键字为您返回一些值。 //序言
// simple prologue
push ebp
mov ebp, esp
// simple epilogue
mov eax, ret_var //by default eax holds return value
mov esp, ebp
pop ebp