Отладка приложений



Подключение функций, экспортируемых по порядковому значению


Должен честно сказать, что почти не поддерживал функций подключения, экспортируемых по порядковому значению, потому что подобная попытка весьма чревата ошибками (из-за того, что разные версии MFC DLL используют различные порядковые значения). Однако если абстрагироваться от проблем, связанных с версиями, то процесс подключения по порядковому значению почти идентичен подключению по имени. Сравните функцию HookordinaiExport, показанную в листинге 14-4, с функцией HookimportedFunctionsByName, рассмотренной в главе 12, и вы увидите, что обе функции выполняют много одинаковых действий.

Листинг 14-4. Функция HookordinaiExport 

BOOL BUGSUTILJ3LLINTERFACE _stdcall

HookordinaiExport ( HMODULE hModule , 

LPCTSTR szImportMod, 

DWORD dwOrdinal ,

 PROC pHookFunc , 

PROC * ppOrigAddr )

{

// Проверить параметры с помощью утверждений.

 ASSERT ( NULL != hModule);

ASSERT ( FALSE == IsBadStringPtr ( szImportMod, MAX_PATH)); 

ASSERT ( 0 != dwOrdinal);

ASSERT ( FALSE = IsBadCodePtr ( pHookFunc));

 // Выполнить проверку ошибок для параметров.

if ( ( NULL == hModule ' ) | |

 ( TRUE == IsBadStringPtr ( szImportMod, MAX_PATH)) || 

( 0 == dwOrdinal ) I I ( TRUE == IsBadCodePtr ( pHookFunc) ) )

 {

SetLastErrorEx ( ERROR_INVALID_PARAMETER, SLE_ERROR);

 return ( FALSE); 

}

if ( NULL != ppOrigAddr)

{

ASSERT ( FALSE ==

IsBadWritePtr ( ppOrigAddr, sizeof ( PROG))); 

if ( TRUE == IsBadWritePtr ( ppOrigAddr, sizeof ( PROC)))

 {

SetLastErrorEx ( ERROR_INVALID_PARAMETER, SLE_ERROR);

 return ( FALSE);

 }

 }

// Получить конкретный дескриптор импорта.

 PIMAGE_IMPORT_DESCRIPTOR plmportDesc =

GetNamedlmportDescriptor ( hModule, szImportMod);

 if ( NULL == plmportDesc) 

{

// Запрошенный модуль не был импортирован. Не возвращать ошибку,

 return ( TRUE); 

}

// Получить информацию об исходных переходниках для этого DLL

. // Невозможно использовать информацию переходников, хранящуюся в




Содержание  Назад  Вперед