winddk: __iob_func переопределение - PullRequest
3 голосов
/ 31 января 2012

Я пытаюсь связать библиотеку пользовательского пространства с драйвером ядра Windows.Он имеет ссылку на __iob_func, который является частью "libcmt.lib" (библиотека пространства пользователя).У меня нет доступа к этой функции в WindDK.Итак, я планирую определить заглушку для __iob_func, которая будет пытаться эмулировать ту же функциональность, что и в библиотеке пространства пользователя.

Кто-нибудь знает, что делает __iob_func?Я нашел объявление функции в заголовочных файлах.Но я не уверен, что именно он делает.

Ответы [ 2 ]

7 голосов
/ 31 января 2012

__iob_func() возвращает указатель на массив дескрипторов FILE, который содержит stdin, stdout, stderr и любые FILE объекты, открытые через библиотеку времени выполнения C. См. Источник библиотеки времени выполнения MSVC _file.c.

Если код вашей библиотеки пользовательского пространства на самом деле пытается многое сделать со средой выполнения C, вы, вероятно, столкнетесь с множеством головных болей, связавших его с драйвером ядра. Удачи.

0 голосов
/ 06 октября 2018

Разберите следующий код c. cl / Fa mycode.c

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

Это в основном то, как будет выглядеть вывод файла сборки с переключателем / Fa в файле c:

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). я обозначает для ввода, о для вывода, б для буфера и т. д. ......

Это просто функция fflush (stdin). fflush (stdout) повторяет те же 4 строки с единственным отличием для stdout во второй строке: push eax + 020h Таким образом, очевидно, каждый член массива состоит из 32 байтов или 8 двойных слов.

Для stderr ассемблер отправляет push eax + 040h или eax + 64 байта

Microsoft Developer Network (MSDN) не документирует функцию __iob_func. Но это объявление, вероятно, будет выглядеть примерно так: lpReturn __iob_func (void)

32-битная сборка обычно возвращает значение функции в регистре eax. И когда значение входного параметра функции описывается как дополнение к регистру (например, eax + 020h), это обычно означает, что оно ссылается на структуру или массив некоторого типа. Таким образом, eax будет начальным адресом структуры или массива. И eax + 020h будет местом в той структуре, где начинается информация для stdout. eax + 040h будет местом, где начинается stderr.

Так что, в принципе, если вы хотите использовать __iob_func в своей программе на c, вам придется создать прототип функции, а затем, возможно, создать собственную личную библиотеку

mylib.def

БИБЛИОТЕКА msvcrt.dll

ЭКСПОРТ __iob_func

А затем запустите lib для этого файла. LIB /def:mylib.def / machine: x86

Это должно создать 32-битную библиотеку mylib.lib, которую вы можете использовать для ссылки в вашу программу.

...