winddk:__ iob_func重新定义

时间:2012-01-31 19:37:10

标签: windows kernel driver

我正在尝试将用户空间库链接到Windows内核驱动程序。它引用了__iob_func,它是“libcmt.lib”(用户空间库)的一部分。 我无法在winddk中访问此功能。所以,我打算为__iob_func定义一个存根,它将尝试模拟与用户空间库中相同的功能。

有谁知道__iob_func做什么?我在头文件中找到了函数的声明。但我不确定它究竟做了什么功能。

2 个答案:

答案 0 :(得分:7)

__iob_func()返回指向FILE描述符数组的指针,这些描述符包含stdinstdoutstderr以及通过其打开的任何FILE个对象C运行时库。请参阅MSVC运行时库源_file.c

如果您的用户空间库代码实际上试图对C运行时做很多事情,那么您可能会遇到很多将其链接到内核驱动程序的麻烦。祝你好运。

答案 1 :(得分:0)

反汇编以下c代码。 cl / Fa mycode.c

fflush (stdin) ;
fflush (stdout) ;
fflush (stderr) ;

基本上,这是在c文件上带有/ Fa开关的汇编文件输出的样子:

call ___iob_func  ; invoke the c function __iob_func
push eax          ; invoke fflush with 1 parameter   
call _fflush
add esp, 04h      ; realign the stack adding 4 bytes to 
                  ; the stack pointer (esp).

因此,显然__iob_func返回一个指向输入输出缓冲区信息的数组或结构的指针;因此是 iob 的缩写,后跟 func (__iob_func)。我代表输入,o代表输出,b代表缓冲区,等等……

那只是fflush(stdin)函数。 fflush(stdout)重复相同的4行,而第二行的stdout唯一不同:     推式电传+ 020h 因此,显然每个数组成员都由32个字节或8个双字组成。

对于stderr,汇编器发布了push eax + 040h或eax + 64字节

Microsoft开发人员网络(MSDN)没有记录__iob_func函数。但是它的声明可能类似于以下内容:lpReturn __iob_func(void)

32位汇编程序通常在eax寄存器中返回函数的值。并且当将函数的输入参数值描述为寄存器的附加值时(例如eax + 020h),通常表示该函数是指某种类型的结构或数组。因此eax将是结构或数组的起始地址。 eax + 020h将是该结构中开始输出stdout信息的位置。 eax + 040h将是stderr开始的位置。

因此,基本上,如果您想在c程序中使用__iob_func,则必须对该函数进行原型设计,然后也许要创建自己的个人lib

mylib.def

库msvcrt.dll

出口     __iob_func

然后在该文件上运行lib。 LIB /def:mylib.def / machine:x86

这应该创建一个名为mylib.lib的32位库,您可以使用它链接到程序中。