Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > вызов функций


Автор: Alexey68 18.11.2013, 08:49
Здравствуйте All.
Хотелось определить системную функцию своим именем, гуглил по темам:
переопределение функций, пользовательский тип данных (но там по этой теме ничего не нашёл), импорт
функций, но может не так искал или так и не понял.
Например имеется функция:
Код

CreateProcess(NULL,pProcessName,NULL,NULL,false, CREATE_NEW_CONSOLE , NULL, NULL, &suStartUpInformation,&piProcessInformation);

а мне необходимо использовать её со своим именем, например:
Код

MyCreateProcess(NULL,pProcessName,NULL,NULL,false, CREATE_NEW_CONSOLE , NULL, NULL, &suStartUpInformation,&piProcessInformation);

какая тема в языке си?, и как правильно определять системные функции под пользовательскими именами?
Прошу подсказать правильное направление.

Автор: GremlinProg 18.11.2013, 08:54
Код

#define MyCreateProcess CreateProcess

А зачем системным функциям давать другие имена?

Автор: Alexey68 18.11.2013, 09:03
Цитата(GremlinProg @ 18.11.2013,  08:54)
Код

#define MyCreateProcess CreateProcess

А зачем системным функциям давать другие имена?

Вообще необходимо понять к какой теме в си это относится, и ещё касперский начинает ругаться, хотя вредоносного ничего нет.
А что делает этот код?:
typedef long int (__stdcall* NtUnmapViewOfSectionF)(HANDLE,PVOID);
NtUnmapViewOfSectionF NtUnmapViewOfSection = (NtUnmapViewOfSectionF)GetProcAddress(LoadLibrary("ntdll.dll"),"NtUnmapViewOfSection");

Автор: GremlinProg 18.11.2013, 09:44
Цитата(Alexey68 @  18.11.2013,  11:03 Найти цитируемый пост)
Вообще необходимо понять к какой теме в си это относится

Если так дальше пойдет, то к данному разделу и относится: C/C++: Системное программирование и WinAPI.

Цитата(Alexey68 @  18.11.2013,  11:03 Найти цитируемый пост)

А что делает этот код?:
Код

typedef long int (__stdcall* NtUnmapViewOfSectionF)(HANDLE,PVOID);
NtUnmapViewOfSectionF NtUnmapViewOfSection = (NtUnmapViewOfSectionF)GetProcAddress(LoadLibrary("ntdll.dll"),"NtUnmapViewOfSection");


Этот код импортирует функцию NtUnmapViewOfSection из ntdll.dll, ничего более (работа с LoadLibrary, конечно корявая, кто бы что не говорил)

Автор: Alexey68 18.11.2013, 22:15
Цитата(GremlinProg @ 18.11.2013,  09:44)
Цитата(Alexey68 @  18.11.2013,  11:03 Найти цитируемый пост)
Вообще необходимо понять к какой теме в си это относится

Если так дальше пойдет, то к данному разделу и относится: C/C++: Системное программирование и WinAPI.

Цитата(Alexey68 @  18.11.2013,  11:03 Найти цитируемый пост)

А что делает этот код?:
Код

typedef long int (__stdcall* NtUnmapViewOfSectionF)(HANDLE,PVOID);
NtUnmapViewOfSectionF NtUnmapViewOfSection = (NtUnmapViewOfSectionF)GetProcAddress(LoadLibrary("ntdll.dll"),"NtUnmapViewOfSection");


Этот код импортирует функцию NtUnmapViewOfSection из ntdll.dll, ничего более (работа с LoadLibrary, конечно корявая, кто бы что не говорил)

Во-первых спасибо,  а как правильно)?
Относительно CreateProcess  и например CreateFile относительно вышеприведённой аналогии?
Как грамотно

Автор: DarthTon 19.11.2013, 11:32
В общем случае лучше делать так:
Код

hMod = GetModuleHandleW( L"DllName.dll" );

if (hMod == NULL)
    hMod = LoadLibraryW( L"DllName.dll" );

if (hMod != NULL)
    pfn = GetProcAddress( hMod, "ProcName" );


Я так понимаю Вам надо избавиться от функций в импорте? В таком случае можно написать свои реализации GetModuleHandle и GetProcAddress(это не очень сложно), и импортировать все функции динамически, по хешу.

Автор: Alexey68 2.12.2013, 12:05
Цитата(DarthTon @ 19.11.2013,  11:32)
Я так понимаю Вам надо избавиться от функций в импорте? В таком случае можно написать свои реализации GetModuleHandle и GetProcAddress(это не очень сложно), и импортировать все функции динамически, по хешу.

Спасибо, да именно это и нужно, но где посмотреть примеры или статьи на эту тему?
можно пример?

Автор: xvr 2.12.2013, 12:41
Цитата(Alexey68 @  2.12.2013,  12:05 Найти цитируемый пост)
но где посмотреть примеры или статьи на эту тему?

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682589%28v=vs.85%29.aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682599%28v=vs.85%29.aspx

Автор: bems 3.12.2013, 02:28
Цитата(DarthTon @  19.11.2013,  11:32 Найти цитируемый пост)
hMod = GetModuleHandleW( L"DllName.dll" );
if (hMod == NULL)
    hMod = LoadLibraryW( L"DllName.dll" );
if (hMod != NULL)
    pfn = GetProcAddress( hMod, "ProcName" );

а если тот кто уже загрузил длл выгрузит ее прямо перед твоим вызовом GetProcAddress?
тогда уже первой строкой делать GetModuleHandleEx или вообще выкинуть это


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)