@@ -584,9 +584,7 @@ HMEMORYMODULE MemoryLoadLibraryEx(const void *data,
584584FARPROC MemoryGetProcAddress (HMEMORYMODULE module , LPCSTR name )
585585{
586586 unsigned char * codeBase = ((PMEMORYMODULE )module )-> codeBase ;
587- int idx = -1 ;
588- DWORD i , * nameRef ;
589- WORD * ordinal ;
587+ int idx ;
590588 PIMAGE_EXPORT_DIRECTORY exports ;
591589 PIMAGE_DATA_DIRECTORY directory = GET_HEADER_DICTIONARY ((PMEMORYMODULE )module , IMAGE_DIRECTORY_ENTRY_EXPORT );
592590 if (directory -> Size == 0 ) {
@@ -602,20 +600,32 @@ FARPROC MemoryGetProcAddress(HMEMORYMODULE module, LPCSTR name)
602600 return NULL ;
603601 }
604602
605- // search function name in list of exported names
606- nameRef = (DWORD * ) (codeBase + exports -> AddressOfNames );
607- ordinal = (WORD * ) (codeBase + exports -> AddressOfNameOrdinals );
608- for (i = 0 ; i < exports -> NumberOfNames ; i ++ , nameRef ++ , ordinal ++ ) {
609- if (_stricmp (name , (const char * ) (codeBase + (* nameRef ))) == 0 ) {
610- idx = * ordinal ;
611- break ;
603+ if (HIWORD (name ) == 0 ) {
604+ // load function by ordinal value
605+ if (LOWORD (name ) < exports -> Base ) {
606+ SetLastError (ERROR_PROC_NOT_FOUND );
607+ return NULL ;
612608 }
613- }
614609
615- if (idx == -1 ) {
616- // exported symbol not found
617- SetLastError (ERROR_PROC_NOT_FOUND );
618- return NULL ;
610+ idx = LOWORD (name ) - exports -> Base ;
611+ } else {
612+ // search function name in list of exported names
613+ DWORD i ;
614+ DWORD * nameRef = (DWORD * ) (codeBase + exports -> AddressOfNames );
615+ WORD * ordinal = (WORD * ) (codeBase + exports -> AddressOfNameOrdinals );
616+ idx = -1 ;
617+ for (i = 0 ; i < exports -> NumberOfNames ; i ++ , nameRef ++ , ordinal ++ ) {
618+ if (_stricmp (name , (const char * ) (codeBase + (* nameRef ))) == 0 ) {
619+ idx = * ordinal ;
620+ break ;
621+ }
622+ }
623+
624+ if (idx == -1 ) {
625+ // exported symbol not found
626+ SetLastError (ERROR_PROC_NOT_FOUND );
627+ return NULL ;
628+ }
619629 }
620630
621631 if ((DWORD )idx > exports -> NumberOfFunctions ) {
0 commit comments