@@ -28,7 +28,10 @@ void ApiReader::ParseModule(ModuleInfo* pModule) {
2828 ParseModuleWithMapping (pModule);
2929 }
3030 else {
31- ParseModuleWithProcess (pModule);
31+ bool success = ParseModuleWithProcess (pModule);
32+ if (!success) {
33+ ParseModuleWithMapping (pModule);
34+ }
3235 }
3336 }
3437}
@@ -37,7 +40,7 @@ void ApiReader::ParseModuleWithMapping(ModuleInfo* pModule) {
3740 ParseExportTable (pModule, true , true );
3841}
3942
40- void ApiReader::ParseExportTable (ModuleInfo* pModule,bool isMapping,bool ownProcess) {
43+ bool ApiReader::ParseExportTable (ModuleInfo* pModule,bool isMapping,bool ownProcess) {
4144 if (isMapping) {
4245 PEParser parser (pModule->_fullPath );
4346 auto exports = parser.GetExports ();
@@ -61,7 +64,7 @@ void ApiReader::ParseExportTable(ModuleInfo* pModule,bool isMapping,bool ownProc
6164 pPE = new BYTE[pModule->_modBaseSize ];
6265 if (!ReadMemoryFromProcess (pModule->_modBaseAddr , pModule->_modBaseSize , pPE)) {
6366 delete[] pPE;
64- return ;
67+ return false ;
6568 }
6669
6770 PEParser parser (pPE);
@@ -101,6 +104,7 @@ void ApiReader::ParseExportTable(ModuleInfo* pModule,bool isMapping,bool ownProc
101104 }
102105 }
103106 }
107+ return true ;
104108}
105109
106110void ApiReader::FindApiByModuleAndOrdinal (ModuleInfo* pModule, WORD ordinal, DWORD_PTR* pVA, DWORD_PTR* pRVA)
@@ -166,24 +170,44 @@ void ApiReader::FindApiInProcess(ModuleInfo* pModule, char* pSearchName, WORD or
166170 PIMAGE_DOS_HEADER pDosHeader = nullptr ;
167171 BYTE* pPE = new BYTE[pModule->_modBaseSize ];
168172
169- ReadMemoryFromProcess (pModule->_modBaseAddr , pModule->_modBaseSize , pPE);
170-
171- PEParser parser (pPE);
173+ bool success = ReadMemoryFromProcess (pModule->_modBaseAddr , pModule->_modBaseSize , pPE);
174+ if (success) {
175+ PEParser parser (pPE);
172176
173- auto exports = parser.GetExports ();
177+ auto exports = parser.GetExports ();
174178
175- for (ExportedSymbol symbol : exports) {
176- if (pSearchName != nullptr ) {
177- if (!strcmp (symbol.Name .c_str (), pSearchName)) {
179+ for (ExportedSymbol symbol : exports) {
180+ if (pSearchName != nullptr ) {
181+ if (!strcmp (symbol.Name .c_str (), pSearchName)) {
182+ *pVA = symbol.Address + pModule->_modBaseAddr ;
183+ *pRVA = symbol.Address ;
184+ break ;
185+ }
186+ }
187+ if (symbol.Ordinal == ordinal) {
178188 *pVA = symbol.Address + pModule->_modBaseAddr ;
179189 *pRVA = symbol.Address ;
180190 break ;
181191 }
182192 }
183- if (symbol.Ordinal == ordinal) {
184- *pVA = symbol.Address + pModule->_modBaseAddr ;
185- *pRVA = symbol.Address ;
186- break ;
193+ }
194+ else {
195+ PEParser parser (pModule->_fullPath );
196+ auto exports = parser.GetExports ();
197+
198+ for (ExportedSymbol symbol : exports) {
199+ if (pSearchName != nullptr ) {
200+ if (!strcmp (symbol.Name .c_str (), pSearchName)) {
201+ *pVA = symbol.Address + pModule->_modBaseAddr ;
202+ *pRVA = symbol.Address ;
203+ break ;
204+ }
205+ }
206+ if (symbol.Ordinal == ordinal) {
207+ *pVA = symbol.Address + pModule->_modBaseAddr ;
208+ *pRVA = symbol.Address ;
209+ break ;
210+ }
187211 }
188212 }
189213
@@ -839,8 +863,8 @@ void ApiReader::HandleForwardedApi(const char* pForwardName, const char* pFuncti
839863 }
840864}
841865
842- void ApiReader::ParseModuleWithProcess (ModuleInfo* pModule) {
843- ParseExportTable (pModule, false );
866+ bool ApiReader::ParseModuleWithProcess (ModuleInfo* pModule) {
867+ return ParseExportTable (pModule, false );
844868}
845869
846870ModuleInfo* ApiReader::FindModuleByName (WCHAR* name) {
0 commit comments