Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
 Аватар для ronaldo
94 / 48 / 63
Регистрация: 16.06.2014
Сообщений: 386

Функция MapAndLoad() работает с dll-файлом, не работает с exe-файлом

22.10.2014, 22:06. Показов 3332. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Объясните, почему программа
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <windows.h>
#include <imagehlp.h>
#include <stdio.h>
int main(int argc,char* argv[]){
LOADED_IMAGE LoadedImage;
PUCHAR BaseAddress;
DWORD RVAExpDir,VAExpAddress;
IMAGE_EXPORT_DIRECTORY* ExpTable;
char* sName;
DWORD nNames;
char* pName;
char** pNames;
DWORD i;
if (!MapAndLoad("kernel32.dll",NULL,&LoadedImage,TRUE,TRUE))
{printf("Something's wrong!\n");
 exit(1);
}
BaseAddress=LoadedImage.MappedAddress;
printf("0x%1x - Base Address\n",BaseAddress);
RVAExpDir=LoadedImage.FileHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
printf("0x%1x -RVA\n",RVAExpDir);
VAExpAddress=(DWORD)ImageRvaToVa(LoadedImage.FileHeader,BaseAddress,RVAExpDir,NULL);
printf("0x%1x -VA\n",VAExpAddress);
ExpTable=(IMAGE_EXPORT_DIRECTORY*)VAExpAddress;
sName=(char*)ImageRvaToVa(LoadedImage.FileHeader,BaseAddress,ExpTable->Name,NULL);
printf("Name of PEF: %s\n",sName);
pNames=(char**)ImageRvaToVa(LoadedImage.FileHeader,BaseAddress,ExpTable->AddressOfNames,NULL);
nNames=ExpTable->NumberOfNames;
printf("Exported data:\n");
for(i=0;i<nNames;i++)
{pName=(char*)ImageRvaToVa(LoadedImage.FileHeader,BaseAddress,(DWORD)*pNames,NULL);
 printf("%s\n",pName);
 *pNames++;}
UnMapAndLoad(&LoadedImage);
return 0;
}
работает (смотри вложение №1), а если 14ю строку кода заменить на
C++
1
if (!MapAndLoad("notepad",NULL,&LoadedImage,FALSE,TRUE))
то программа не работает корректно (смотри вложение №2). Судя по тому, что программа выводит, 24 и 25 строки неверны, вот только я ошибку не вижу. Напишите, кто видит.
Миниатюры
Функция MapAndLoad() работает с dll-файлом, не работает с exe-файлом   Функция MapAndLoad() работает с dll-файлом, не работает с exe-файлом  
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.10.2014, 22:06
Ответы с готовыми решениями:

Неправильно работает функция write при работе с файлом
Добрый день. Выполняю задачу по созданию файла с произвольным доступом и взаимодействию с ним. Имеется функция, которая должна добавлять...

Работа с файлом не работает
Задание Разработать командный файл для интерпретатора командной строки cmd os windows для решения задачи нахождение суммарного объема...

массив с файлом!не работает((
ребят,помогите,почему не работает?! Program matrixSum; Type matrx_ = record col: array of integer; end; Var i:integer; ...

13
Native x86
Эксперт Hardware
 Аватар для quwy
6857 / 3790 / 1025
Регистрация: 13.02.2013
Сообщений: 11,861
22.10.2014, 22:12
Цитата Сообщение от ronaldo Посмотреть сообщение
Напишите, кто видит.
"notepad" -- это не имя исполняемого модуля. То, что в командной строке по команде notepad запускается программа C:\WINDOWS\System32\notepad.exe, еще не значит, что путь к файлу и особенно его расширение будут додумывать вообще все системные функции.
0
 Аватар для ronaldo
94 / 48 / 63
Регистрация: 16.06.2014
Сообщений: 386
22.10.2014, 22:25  [ТС]
Если я правильно Вас понял, то
Миниатюры
Функция MapAndLoad() работает с dll-файлом, не работает с exe-файлом  
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
24.10.2014, 10:25
Путь правильно напиши.
C++
1
if (!MapAndLoad("c:\\Windows\\system32\\notepad.exe",NULL,&LoadedImage,FALSE,TRUE))
1
 Аватар для ronaldo
94 / 48 / 63
Регистрация: 16.06.2014
Сообщений: 386
24.10.2014, 13:55  [ТС]
Не работает.
Я тут лазил в инете, вычитал где-то, что не для всех файлов ExpTable есть, но задача - получить список экспортируемых функций модулей процесса notepad.exe - по-прежнему не решена.
Миниатюры
Функция MapAndLoad() работает с dll-файлом, не работает с exe-файлом  
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
24.10.2014, 14:02
А с какой стати блокнот должен экспортировать функции?
В моей системе Win7 x86_64 он ничего не экспортирует, что само сабой логично, ведь это не библиотека, а приложение.
0
 Аватар для ronaldo
94 / 48 / 63
Регистрация: 16.06.2014
Сообщений: 386
24.10.2014, 14:13  [ТС]
Думаете, в этом и есть "соль" задания? А почему, кстати, приложение не может ничего экспортировать?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
24.10.2014, 14:55
Я не говорил что "не может". Я сказал что именно блокнот ничего не экспортирует, как и большинство других приложений.

Попробуй вот этот файл. В нём я экспортировал функцию с именем foo.
Вложения
Тип файла: zip main.zip (5.7 Кб, 13 просмотров)
0
 Аватар для ronaldo
94 / 48 / 63
Регистрация: 16.06.2014
Сообщений: 386
24.10.2014, 15:11  [ТС]
Во вложении смотри, что вышло из попытки открыть файл.
И что-то я не понял, зачем мне exe-файл. Мне же код нужен. Скинь, пожалуйста, если есть.
Миниатюры
Функция MapAndLoad() работает с dll-файлом, не работает с exe-файлом  
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
24.10.2014, 16:23
В общем, чтобы программа не зависала нужно сделать проверку на существование директории экспорта.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <windows.h>
#include <imagehlp.h>
#include <stdio.h>
 
int main( int narg, char *argv[] )
{
    LOADED_IMAGE                LoadedImage;
    PUCHAR                      BaseAddress;
    DWORD                       RVAExpDir, VAExpAddress;
    IMAGE_EXPORT_DIRECTORY *    ExpTable;
    char *                      sName;
    DWORD                       nNames;
    char *                      pName;
    char **                     pNames;
    //DWORD                     i;
 
    if ( narg != 2 ) return 1;
 
    if ( !MapAndLoad( argv[1], NULL, &LoadedImage, TRUE, TRUE ) ) {
        printf( "Something's wrong!\n" );
        exit( 1 );
    }
 
    BaseAddress = LoadedImage.MappedAddress;
    printf( "0x%1x - Base Address\n", (unsigned)BaseAddress );
 
    RVAExpDir = LoadedImage.FileHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
    if ( RVAExpDir ) {
        printf( "0x%1x -RVA\n", (unsigned)RVAExpDir );
 
        VAExpAddress = (DWORD)ImageRvaToVa( LoadedImage.FileHeader, BaseAddress, RVAExpDir, NULL );
        printf( "0x%1x -VA\n", (unsigned)VAExpAddress );
 
        ExpTable = (IMAGE_EXPORT_DIRECTORY *)VAExpAddress;
        sName = (char *)ImageRvaToVa( LoadedImage.FileHeader, BaseAddress, ExpTable->Name, NULL );
        printf( "Name of PEF: %s\n", sName );
 
        pNames = (char **)ImageRvaToVa( LoadedImage.FileHeader, BaseAddress, ExpTable->AddressOfNames, NULL );
        nNames = ExpTable->NumberOfNames;
        printf( "Exported data:\n" );
 
        for ( unsigned i = 0; i < nNames; i++ ) {
            pName = (char *)ImageRvaToVa( LoadedImage.FileHeader, BaseAddress, (DWORD)*pNames, NULL );
            printf( "%s\n", pName );
            *pNames++;
        }
    } else {
        printf( "No export directory.\n" );
    }
    UnMapAndLoad( &LoadedImage );
    return 0;
}
1
 Аватар для ronaldo
94 / 48 / 63
Регистрация: 16.06.2014
Сообщений: 386
24.10.2014, 16:58  [ТС]
В точку последний пост - пишет No export directory.
А что из этого следует? Что блокнот не экспортирует функции?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
24.10.2014, 17:02
Лучший ответ Сообщение было отмечено ronaldo как решение

Решение

Поправка.
В 28-й строке надо проверять не адрес, а размер таблицы LoadedImage.FileHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size

Добавлено через 1 минуту
Цитата Сообщение от ronaldo Посмотреть сообщение
А что из этого следует? Что блокнот не экспортирует функции?
Да.
Подправленная версия:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <windows.h>
#include <imagehlp.h>
#include <stdio.h>
 
int main( int narg, char *argv[] )
{
    LOADED_IMAGE                LoadedImage;
    PUCHAR                      BaseAddress;
    DWORD                       RVAExpDir, VAExpAddress;
    IMAGE_EXPORT_DIRECTORY *    ExpTable;
    char *                      sName;
    DWORD                       nNames;
    char *                      pName;
    char **                     pNames;
    //DWORD                     i;
 
    if ( narg != 2 ) return 1;
 
    if ( !MapAndLoad( argv[1], NULL, &LoadedImage, TRUE, TRUE ) ) {
        printf( "Something's wrong!\n" );
        exit( 1 );
    }
 
    BaseAddress = LoadedImage.MappedAddress;
    printf( "0x%1x - Base Address\n", (unsigned)BaseAddress );
 
    if ( LoadedImage.FileHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size ) {
        RVAExpDir = LoadedImage.FileHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
        printf( "0x%1x -RVA\n", (unsigned)RVAExpDir );
 
        VAExpAddress = (DWORD)ImageRvaToVa( LoadedImage.FileHeader, BaseAddress, RVAExpDir, NULL );
        printf( "0x%1x -VA\n", (unsigned)VAExpAddress );
 
        ExpTable = (IMAGE_EXPORT_DIRECTORY *)VAExpAddress;
        sName = (char *)ImageRvaToVa( LoadedImage.FileHeader, BaseAddress, ExpTable->Name, NULL );
        printf( "Name of PEF: %s\n", sName );
 
        pNames = (char **)ImageRvaToVa( LoadedImage.FileHeader, BaseAddress, ExpTable->AddressOfNames, NULL );
        nNames = ExpTable->NumberOfNames;
        printf( "Exported data:\n" );
 
        for ( unsigned i = 0; i < nNames; i++ ) {
            pName = (char *)ImageRvaToVa( LoadedImage.FileHeader, BaseAddress, (DWORD)*pNames, NULL );
            printf( "%s\n", pName );
            *pNames++;
        }
    } else {
        printf( "No export directory.\n" );
    }
    UnMapAndLoad( &LoadedImage );
    return 0;
}
1
 Аватар для ronaldo
94 / 48 / 63
Регистрация: 16.06.2014
Сообщений: 386
24.10.2014, 17:37  [ТС]
Спасибо.
Я сказал что именно блокнот ничего не экспортирует, как и большинство других приложений.
Можете привести пример приложения, которое экспортирует функции?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
24.10.2014, 20:13
Цитата Сообщение от ronaldo Посмотреть сообщение
Можете привести пример приложения, которое экспортирует функции?
Пример такой программы я привёл в 8-м посте (Функция MapAndLoad() работает с dll-файлом, не работает с exe-файлом), но твой антивирус почему-то принял её за вредоносную..

У меня в системе (в папке Windows\system32) есть программа diskraid.exe. Так вот она экспортирует три метода класса, включая конструктор и деструктор.

Я нашел еще несколько исполняемых файлов, которые экспортируют функции, но их эта программа почему-то их не видит.
Я не эксперт в этой области, поэтому причин назвать не могу.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.10.2014, 20:13
Помогаю со студенческими работами здесь

Не работает работа с файлом
Подскажите что делать? Функция должна отвечать за чтение дерева из файла. #include &lt;conio.h&gt; #include &lt;stdio.h&gt; ...

Работа с файлом - код не работает
Здравствуйте. Пишу на xCode #include &lt;stdio.h&gt; int main() { FILE *f; f = fopen(&quot;text.txt&quot;, &quot;w+&quot;); ...

Скрипт не работает с файлом из браузера
#!/usr/local/bin/perl -w use warnings; use strict; use CGI qw (:standard); use DBI; my $value; my $value1; my $val; ...

Не работает hitTestPoint с png файлом
Загружаю png файл в свой проект, делаю из него мувик. Сам файл - ландшафт, без фона. Когда рисую в самом флеше, hitTestPoint работает, а...

Работа с файлом, не работает внутренний цикл
def get_ready(f_var, st_am, text): if text: with open(f_var, 'a') as f: f.write(text + '\n') with...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru