小编ano*_*non的帖子

objdump如何设法使用-S选项显示源代码?

二进制文件中是否有对源文件的引用?我尝试在二进制文件上运行字符串,但找不到对列出的源文件的任何引用...

c linux gcc objdump disassembly

26
推荐指数
2
解决办法
4万
查看次数

10
推荐指数
3
解决办法
9832
查看次数

为什么调用者必须在cdecl调用约定中清除堆栈?

来自:http://en.wikipedia.org/wiki/X86_calling_conventions

push c
push b
push a
call function_name
add esp, 12 ;Stack clearing
mov x, eax
Run Code Online (Sandbox Code Playgroud)

为什么我们需要显式地向ESP添加12以清除堆栈,因为被调用的函数应该将参数从堆栈中取出,因此恢复堆栈指针......?

另一个问题:

从理论上讲,可以实现变量参数函数,callee负责清理权限(例如,如果在寄存器中传递堆栈中的参数数量)?

c compiler-construction assembly stack calling-convention

6
推荐指数
2
解决办法
3329
查看次数

Windows命名管道问题

我正在编写一个通过命名管道与用户态应用程序通信的驱动程序.userland应用程序通过调用CreateNamedPipe()创建命名管道,然后通过调用IOCTL将管道名称传递给驱动程序.然后驱动程序通过调用ZwCreateFile()打开管道.

然后userland应用程序命中一个循环,该循环读取来自管道的请求,处理请求并将结果写回管道,即:

while(1) {
ReadFromPipe
ProcessRequest
WriteToPipe
}
Run Code Online (Sandbox Code Playgroud)

驱动程序基本上将请求写入管道,然后直接读回答案:

WriteRequestToPipe
ReadAnswerFromPipe
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果在应用程序中发生WriteToPipe之前在驱动程序中发生ReadAnswerFromPipe,则ReadAnswerFromPipe永远不会返回.所以基本上做

WriteRequestToPipe
Sleep(10 seconds)
ReadAnswerFromPipe
Run Code Online (Sandbox Code Playgroud)

解决了这个问题.

我为什么看到这个?

澄清:我使用两个不同的单向管道,尽管应用程序最终成功调用WriteToPipe,但ReadAnswerFromPipe调用永远不会返回...

c windows drivers driver named-pipes

2
推荐指数
1
解决办法
1831
查看次数