Возникла проблема при ручном биндинге импорта. Есть функция из ндис.сис Например NdisInitUnicodeString Мы в драйвере 1. Находим ImageBase ndis.sys 2. находим таблицу экспорта 3. Парсим ее, находим нужный ординал 4. Умножаем ординал на 4 и прибавляем VA таблицы адресов. Теоретически, в нормальных ситуациях, в полученной ячейке лежит адрес экспортируемой функции. В большинстве случаев так и есть. Но изредка,как в случае с NdisInitUnicodeString, в ячейке лежит указатель на строку "NTOSKRNL.RtlInitUnicodeString" Я дописал еще часть кода, которая выдегивает имя модуля ntoskrnl и имя функции и все по новой с шага 1 для соотв. модуля Такие вопросы: NTOSKRNL.xxxx - это частный случай или встречаются и другие подобные случаи с другими модулями? И например, если есть два модуля OurModule.dll, OurModue.sys и все в кернелспейсе, а функа ссылается на OurMoudle.OurFunction, то как обрабатывать подобные ситуации?
По первому вопросу: Такая штука называется форвард, простейший пример - функция kernel32.HeapAlloc в ntdll.RtlAllocateHeap. обрабатывается так: берется тот адрес, который ты находишь по таблице экспорта и проверяется на принадлежность к самой таблице, если адрес лежит внутри ее, то это форвард. все что до точки - имя модуля, все что после - имя функции. более подробно "описано" в функции GetProcAddress
"Visual Studio, Microsoft Portable Executable and Common Object File Format Specification" обычно тоже помогает %)