diff --git a/TitanEngine/Global.Debugger.cpp b/TitanEngine/Global.Debugger.cpp index 004bb76..220d922 100644 --- a/TitanEngine/Global.Debugger.cpp +++ b/TitanEngine/Global.Debugger.cpp @@ -26,7 +26,7 @@ DEBUG_EVENT TerminateDBGEvent = {}; DWORD ProcessExitCode = 0; HANDLE DBGFileHandle; ULONG_PTR tlsCallBackList[100]; -LPVOID hListProcess = 0; +std::vector hListProcess; int engineStepCount = INFINITE; LPVOID engineStepCallBack = NULL; bool engineStepActive = false; @@ -64,4 +64,9 @@ void DebuggerReset() { RtlZeroMemory(&myDBGCustomHandler, sizeof CustomHandler); } -} \ No newline at end of file +} + +void ClearProcessList() +{ + std::vector().swap(hListProcess); +} diff --git a/TitanEngine/Global.Debugger.h b/TitanEngine/Global.Debugger.h index b6c7300..2204803 100644 --- a/TitanEngine/Global.Debugger.h +++ b/TitanEngine/Global.Debugger.h @@ -1,6 +1,8 @@ #ifndef _GLOBAL_DEBUGGER_H #define _GLOBAL_DEBUGGER_H +#include + extern HARDWARE_DATA DebugRegister[4]; extern PROCESS_INFORMATION dbgProcessInformation; extern CustomHandler myDBGCustomHandler; @@ -24,7 +26,7 @@ extern DEBUG_EVENT TerminateDBGEvent; extern DWORD ProcessExitCode; extern HANDLE DBGFileHandle; extern ULONG_PTR tlsCallBackList[100]; -extern LPVOID hListProcess; +extern std::vector hListProcess; extern int engineStepCount; extern LPVOID engineStepCallBack; extern bool engineStepActive; @@ -36,5 +38,6 @@ extern LPVOID engineAttachedProcessDebugInfo; long DebugLoopInSecondThread(LPVOID InputParameter); void DebuggerReset(); +void ClearProcessList(); -#endif //_GLOBAL_DEBUGGER_H \ No newline at end of file +#endif //_GLOBAL_DEBUGGER_H diff --git a/TitanEngine/Global.Librarian.cpp b/TitanEngine/Global.Librarian.cpp index 44a268e..e7789dd 100644 --- a/TitanEngine/Global.Librarian.cpp +++ b/TitanEngine/Global.Librarian.cpp @@ -3,6 +3,10 @@ #include "Global.Librarian.h" // Global.Engine.Librarian: -LIBRARY_ITEM_DATA LibraryInfoData = {}; -LPVOID LibrarianData = VirtualAlloc(NULL, MAX_LIBRARY_BPX * sizeof LIBRARY_BREAK_DATA, MEM_COMMIT, PAGE_READWRITE); -LPVOID hListLibrary = 0; \ No newline at end of file +std::vector hListLibrary; +std::vector LibrarianData; + +void ClearLibraryList() +{ + std::vector().swap(hListLibrary); +} diff --git a/TitanEngine/Global.Librarian.h b/TitanEngine/Global.Librarian.h index c070991..d7caeb0 100644 --- a/TitanEngine/Global.Librarian.h +++ b/TitanEngine/Global.Librarian.h @@ -1,8 +1,11 @@ #ifndef _GLOBAL_LIBRARIAN_H #define _GLOBAL_LIBRARIAN_H -extern LIBRARY_ITEM_DATA LibraryInfoData; -extern LPVOID LibrarianData; -extern LPVOID hListLibrary; +#include -#endif //_GLOBAL_LIBRARIAN_H \ No newline at end of file +extern std::vector hListLibrary; +extern std::vector LibrarianData; + +void ClearLibraryList(); + +#endif //_GLOBAL_LIBRARIAN_H diff --git a/TitanEngine/TitanEngine.Debugger.Control.cpp b/TitanEngine/TitanEngine.Debugger.Control.cpp index 6a0f701..92b6845 100644 --- a/TitanEngine/TitanEngine.Debugger.Control.cpp +++ b/TitanEngine/TitanEngine.Debugger.Control.cpp @@ -8,54 +8,35 @@ __declspec(dllexport) void TITCALL ForceClose() { - /*wchar_t szTempName[MAX_PATH]; - wchar_t szTempFolder[MAX_PATH];*/ - PPROCESS_ITEM_DATA hListProcessPtr = NULL; - PTHREAD_ITEM_DATA hListThreadPtr = NULL; - PLIBRARY_ITEM_DATAW hListLibraryPtr = NULL; - //manage lists - if(hListProcess != NULL) + //manage process list + int processcount=hListProcess.size(); + for(int i=0; ihProcess != NULL) - { - __try - { - EngineCloseHandle(hListProcessPtr->hFile); - EngineCloseHandle(hListProcessPtr->hProcess); - } - __except(EXCEPTION_EXECUTE_HANDLER) - { - - } - hListProcessPtr = (PPROCESS_ITEM_DATA)((ULONG_PTR)hListProcessPtr + sizeof PROCESS_ITEM_DATA); - } - RtlZeroMemory(hListProcess, MAX_DEBUG_DATA * sizeof PROCESS_ITEM_DATA); + EngineCloseHandle(hListProcess.at(i).hFile); + EngineCloseHandle(hListProcess.at(i).hProcess); } - + ClearProcessList(); + //manage thread list int threadcount=hListThread.size(); - for(int i=threadcount-1; i>-1; i--) + for(int i=0; ihFile != NULL) + if(hListLibrary.at(i).hFile != (HANDLE)-1) { - if(hListLibraryPtr->hFile != (HANDLE)-1) + if(hListLibrary.at(i).hFileMappingView != NULL) { - if(hListLibraryPtr->hFileMappingView != NULL) - { - UnmapViewOfFile(hListLibraryPtr->hFileMappingView); - EngineCloseHandle(hListLibraryPtr->hFileMapping); - } - EngineCloseHandle(hListLibraryPtr->hFile); + UnmapViewOfFile(hListLibrary.at(i).hFileMappingView); + EngineCloseHandle(hListLibrary.at(i).hFileMapping); } - hListLibraryPtr = (PLIBRARY_ITEM_DATAW)((ULONG_PTR)hListLibraryPtr + sizeof LIBRARY_ITEM_DATAW); + EngineCloseHandle(hListLibrary.at(i).hFile); } - RtlZeroMemory(hListLibrary, MAX_DEBUG_DATA * sizeof LIBRARY_ITEM_DATAW); } + ClearLibraryList(); + if(!engineProcessIsNowDetached) { StopDebug(); diff --git a/TitanEngine/TitanEngine.Debugger.DebugLoop.cpp b/TitanEngine/TitanEngine.Debugger.DebugLoop.cpp index 9d1d461..5691070 100644 --- a/TitanEngine/TitanEngine.Debugger.DebugLoop.cpp +++ b/TitanEngine/TitanEngine.Debugger.DebugLoop.cpp @@ -17,23 +17,16 @@ static DWORD engineWaitForDebugEventTimeOut = INFINITE; __declspec(dllexport) void TITCALL DebugLoop() { - int j = NULL; - int k = NULL; bool FirstBPX = true; bool ResetBPX = false; bool BreakDBG = false; bool ResetHwBPX = false; bool ResetMemBPX = false; - bool CompareResult = false; bool SecondChance = false; - ULONG_PTR CmpValue1 = NULL; - ULONG_PTR CmpValue2 = NULL; bool hListProcessFirst = true; bool hListThreadFirst = true; bool hListLibraryFirst = true; - PPROCESS_ITEM_DATA hListProcessPtr = NULL; - //PTHREAD_ITEM_DATA hListThreadPtr = NULL; - PLIBRARY_ITEM_DATAW hListLibraryPtr = NULL; + bool MemoryBpxFound = false; PLIBRARY_ITEM_DATAW hLoadedLibData = NULL; PLIBRARY_BREAK_DATA ptrLibrarianData = NULL; typedef void(TITCALL *fCustomBreakPoint)(void); @@ -46,7 +39,6 @@ __declspec(dllexport) void TITCALL DebugLoop() ULONG_PTR ResetBPXAddressTo = 0; ULONG_PTR ResetMemBPXAddress = 0; SIZE_T ResetMemBPXSize = 0; - //int MaximumBreakPoints = 0; ULONG_PTR NumberOfBytesReadWritten = 0; MEMORY_BASIC_INFORMATION MemInfo; HANDLE hActiveThread; @@ -61,7 +53,7 @@ __declspec(dllexport) void TITCALL DebugLoop() HANDLE hFileMapping; LPVOID hFileMappingView; LPVOID DBGEntryPoint; - bool MemoryBpxFound = false; + wchar_t* szTranslatedNativeName; DBGFileHandle = NULL; @@ -73,9 +65,9 @@ __declspec(dllexport) void TITCALL DebugLoop() DebugRegister[3].DrxEnabled = false; engineProcessIsNowDetached = false; engineResumeProcessIfNoThreadIsActive = false; - RtlZeroMemory(&DBGEvent, sizeof DEBUG_EVENT); - RtlZeroMemory(&TerminateDBGEvent, sizeof DEBUG_EVENT); - RtlZeroMemory(&DLLDebugFileName, 512); + memset(&DBGEvent, 0, sizeof(DEBUG_EVENT)); + memset(&TerminateDBGEvent, 0, sizeof(DEBUG_EVENT)); + memset(&DLLDebugFileName, 0, sizeof(DLLDebugFileName)); ExtensionManagerPluginResetCallBack(); engineFileIsBeingDebugged = true; if(engineExecutePluginCallBack) @@ -131,30 +123,14 @@ __declspec(dllexport) void TITCALL DebugLoop() VirtualAllocEx(dbgProcessInformation.hProcess, (void*)DebugReserveModuleBase, 0x1000, MEM_RESERVE, PAGE_READWRITE); //return value nt used, yea just ignore. return value doesnt matter and there is no possible fix when failed :D this is only used to make sure DLL loads on another image base } } - if(hListProcess == NULL) - { - hListProcess = VirtualAlloc(NULL, MAX_DEBUG_DATA * sizeof PROCESS_ITEM_DATA, MEM_COMMIT, PAGE_READWRITE); - } - else - { - if(hListProcessFirst == true) - { - RtlZeroMemory(hListProcess, MAX_DEBUG_DATA * sizeof PROCESS_ITEM_DATA); - } - } + if(hListProcessFirst) //clear process list + ClearProcessList(); + hListProcessFirst = false; + if(hListThreadFirst) //clear thread list ClearThreadList(); - - hListProcessPtr = (PPROCESS_ITEM_DATA)hListProcess; - hListProcessPtr->hFile = DBGEvent.u.CreateProcessInfo.hFile; - hListProcessPtr->hProcess = DBGEvent.u.CreateProcessInfo.hProcess; - hListProcessPtr->hThread = DBGEvent.u.CreateProcessInfo.hThread; - hListProcessPtr->dwProcessId = DBGEvent.dwProcessId; - hListProcessPtr->dwThreadId = DBGEvent.dwThreadId; - hListProcessPtr->BaseOfImage = (void*)DBGEvent.u.CreateProcessInfo.lpBaseOfImage; - hListProcessPtr->ThreadStartAddress = (void*)DBGEvent.u.CreateProcessInfo.lpStartAddress; - hListProcessPtr->ThreadLocalBase = (void*)DBGEvent.u.CreateProcessInfo.lpThreadLocalBase; - + hListThreadFirst = false; + //update thread list THREAD_ITEM_DATA NewThreadData; memset(&NewThreadData, 0, sizeof(THREAD_ITEM_DATA)); NewThreadData.dwThreadId = DBGEvent.dwThreadId; @@ -162,28 +138,19 @@ __declspec(dllexport) void TITCALL DebugLoop() NewThreadData.ThreadStartAddress = (void*)DBGEvent.u.CreateProcessInfo.lpStartAddress; NewThreadData.ThreadLocalBase = (void*)DBGEvent.u.CreateProcessInfo.lpThreadLocalBase; hListThread.push_back(NewThreadData); - hListThreadFirst = false; - } - else //we have a valid handle already (which means a child process started) - { - hListProcessPtr = (PPROCESS_ITEM_DATA)hListProcess; - while(hListProcessPtr->hProcess != NULL) - { - hListProcessPtr = (PPROCESS_ITEM_DATA)((ULONG_PTR)hListProcessPtr + sizeof PROCESS_ITEM_DATA); - } - if(hListProcessPtr->hProcess == NULL) - { - hListProcessPtr->hFile = DBGEvent.u.CreateProcessInfo.hFile; - hListProcessPtr->hProcess = DBGEvent.u.CreateProcessInfo.hProcess; - hListProcessPtr->hThread = DBGEvent.u.CreateProcessInfo.hThread; - hListProcessPtr->dwProcessId = DBGEvent.dwProcessId; - hListProcessPtr->dwThreadId = DBGEvent.dwThreadId; - hListProcessPtr->BaseOfImage = (void*)DBGEvent.u.CreateProcessInfo.lpBaseOfImage; - hListProcessPtr->ThreadStartAddress = (void*)DBGEvent.u.CreateProcessInfo.lpStartAddress; - hListProcessPtr->ThreadLocalBase = (void*)DBGEvent.u.CreateProcessInfo.lpThreadLocalBase; - hListProcessFirst = false; - } } + //update process list + PROCESS_ITEM_DATA NewProcessItem; + memset(&NewProcessItem, 0, sizeof(PROCESS_ITEM_DATA)); + NewProcessItem.hFile = DBGEvent.u.CreateProcessInfo.hFile; + NewProcessItem.hProcess = DBGEvent.u.CreateProcessInfo.hProcess; + NewProcessItem.hThread = DBGEvent.u.CreateProcessInfo.hThread; + NewProcessItem.dwProcessId = DBGEvent.dwProcessId; + NewProcessItem.dwThreadId = DBGEvent.dwThreadId; + NewProcessItem.BaseOfImage = (void*)DBGEvent.u.CreateProcessInfo.lpBaseOfImage; + NewProcessItem.ThreadStartAddress = (void*)DBGEvent.u.CreateProcessInfo.lpStartAddress; + NewProcessItem.ThreadLocalBase = (void*)DBGEvent.u.CreateProcessInfo.lpThreadLocalBase; + hListProcess.push_back(NewProcessItem); //process created callback if(DBGCustomHandler->chCreateProcess != NULL) @@ -297,40 +264,26 @@ __declspec(dllexport) void TITCALL DebugLoop() case LOAD_DLL_DEBUG_EVENT: { //maintain library list - if(hListLibrary == NULL) - { - hListLibrary = VirtualAlloc(NULL, MAX_DEBUG_DATA * sizeof LIBRARY_ITEM_DATAW, MEM_COMMIT, PAGE_READWRITE); - } - else - { - if(hListLibraryFirst == true) - { - RtlZeroMemory(hListLibrary, MAX_DEBUG_DATA * sizeof LIBRARY_ITEM_DATAW); - } - } + if(hListLibraryFirst) + ClearLibraryList(); hListLibraryFirst = false; - hListLibraryPtr = (PLIBRARY_ITEM_DATAW)hListLibrary; - while(hListLibraryPtr->hFile != NULL) - { - hListLibraryPtr = (PLIBRARY_ITEM_DATAW)((ULONG_PTR)hListLibraryPtr + sizeof LIBRARY_ITEM_DATAW); - } - hListLibraryPtr->hFile = DBGEvent.u.LoadDll.hFile; - hListLibraryPtr->BaseOfDll = DBGEvent.u.LoadDll.lpBaseOfDll; + LIBRARY_ITEM_DATAW NewLibraryData; + memset(&NewLibraryData, 0, sizeof(LIBRARY_ITEM_DATAW)); + NewLibraryData.hFile = DBGEvent.u.LoadDll.hFile; + NewLibraryData.BaseOfDll = DBGEvent.u.LoadDll.lpBaseOfDll; hFileMapping = CreateFileMappingA(DBGEvent.u.LoadDll.hFile, NULL, PAGE_READONLY, NULL, GetFileSize(DBGEvent.u.LoadDll.hFile, NULL), NULL); if(hFileMapping != NULL) { hFileMappingView = MapViewOfFile(hFileMapping, FILE_MAP_READ, NULL, NULL, NULL); if(hFileMappingView != NULL) { - hListLibraryPtr->hFileMapping = hFileMapping; - hListLibraryPtr->hFileMappingView = hFileMappingView; + NewLibraryData.hFileMapping = hFileMapping; + NewLibraryData.hFileMappingView = hFileMappingView; if(GetMappedFileNameW(GetCurrentProcess(), hFileMappingView, DLLDebugFileName, sizeof(DLLDebugFileName)/sizeof(DLLDebugFileName[0])) > NULL) { int i = lstrlenW(DLLDebugFileName); - while(DLLDebugFileName[i] != 0x5C && i >= NULL) - { + while(DLLDebugFileName[i]!='\\' && i) i--; - } if(DebugDebuggingDLL) { if(lstrcmpiW(&DLLDebugFileName[i+1], DebugDebuggingDLLFileName) == NULL) @@ -353,42 +306,36 @@ __declspec(dllexport) void TITCALL DebugLoop() engineFakeDLLHandle = (ULONG_PTR)DBGEvent.u.LoadDll.lpBaseOfDll; } } - lstrcpyW(hListLibraryPtr->szLibraryName, &DLLDebugFileName[i+1]); + lstrcpyW(NewLibraryData.szLibraryName, &DLLDebugFileName[i+1]); szTranslatedNativeName = (wchar_t*)TranslateNativeNameW(DLLDebugFileName); - lstrcpyW(hListLibraryPtr->szLibraryPath, szTranslatedNativeName); + lstrcpyW(NewLibraryData.szLibraryPath, szTranslatedNativeName); VirtualFree((void*)szTranslatedNativeName, NULL, MEM_RELEASE); - RtlZeroMemory(szAnsiLibraryName, sizeof szAnsiLibraryName); - WideCharToMultiByte(CP_ACP, NULL, hListLibraryPtr->szLibraryName, -1, szAnsiLibraryName, sizeof szAnsiLibraryName, NULL, NULL); - ptrLibrarianData = (PLIBRARY_BREAK_DATA)LibrarianData; - k = NULL; - if(ptrLibrarianData != NULL) + RtlZeroMemory(szAnsiLibraryName, sizeof(szAnsiLibraryName)); + WideCharToMultiByte(CP_ACP, NULL, NewLibraryData.szLibraryName, -1, szAnsiLibraryName, sizeof szAnsiLibraryName, NULL, NULL); + + //library breakpoint + int libbpcount=LibrarianData.size(); + for(int i=libbpcount-1; i>-1; i--) { - while(k < MAX_LIBRARY_BPX) + ptrLibrarianData=&LibrarianData.at(i); + if(!lstrcmpiA(ptrLibrarianData->szLibraryName, szAnsiLibraryName)) { - if(ptrLibrarianData->szLibraryName[0] != 0x00) + if(ptrLibrarianData->bpxType == UE_ON_LIB_LOAD || ptrLibrarianData->bpxType == UE_ON_LIB_ALL) { - if(lstrcmpiA(ptrLibrarianData->szLibraryName, szAnsiLibraryName) == NULL) + myCustomHandler = (fCustomHandler)(ptrLibrarianData->bpxCallBack); + __try { - if(ptrLibrarianData->bpxType == UE_ON_LIB_LOAD || ptrLibrarianData->bpxType == UE_ON_LIB_ALL) - { - myCustomHandler = (fCustomHandler)(ptrLibrarianData->bpxCallBack); - __try - { - myCustomHandler(&DBGEvent.u.LoadDll); - } - __except(EXCEPTION_EXECUTE_HANDLER) - { - LibrarianRemoveBreakPoint(ptrLibrarianData->szLibraryName, ptrLibrarianData->bpxType); - } - if(ptrLibrarianData->bpxSingleShoot) - { - LibrarianRemoveBreakPoint(ptrLibrarianData->szLibraryName, ptrLibrarianData->bpxType); - } - } + myCustomHandler(&DBGEvent.u.LoadDll); + } + __except(EXCEPTION_EXECUTE_HANDLER) + { + LibrarianRemoveBreakPoint(ptrLibrarianData->szLibraryName, ptrLibrarianData->bpxType); + } + if(ptrLibrarianData->bpxSingleShoot) + { + LibrarianRemoveBreakPoint(ptrLibrarianData->szLibraryName, ptrLibrarianData->bpxType); } } - ptrLibrarianData = (PLIBRARY_BREAK_DATA)((ULONG_PTR)ptrLibrarianData + sizeof LIBRARY_BREAK_DATA); - k++; } } } @@ -426,65 +373,53 @@ __declspec(dllexport) void TITCALL DebugLoop() } } - //maintain library list - k = NULL; - ptrLibrarianData = (PLIBRARY_BREAK_DATA)LibrarianData; + //library breakpoint hLoadedLibData = (PLIBRARY_ITEM_DATAW)LibrarianGetLibraryInfoEx(DBGEvent.u.UnloadDll.lpBaseOfDll); - if(hLoadedLibData != NULL) + if(hLoadedLibData) { - RtlZeroMemory(szAnsiLibraryName, sizeof szAnsiLibraryName); + RtlZeroMemory(szAnsiLibraryName, sizeof(szAnsiLibraryName)); WideCharToMultiByte(CP_ACP, NULL, hLoadedLibData->szLibraryName, -1, szAnsiLibraryName, sizeof szAnsiLibraryName, NULL, NULL); - if(ptrLibrarianData != NULL) + int libbpcount=LibrarianData.size(); + for(int i=libbpcount-1; i>-1; i--) { - while(k < MAX_LIBRARY_BPX) + ptrLibrarianData=&LibrarianData.at(i); + if(!lstrcmpiA(ptrLibrarianData->szLibraryName, szAnsiLibraryName)) { - if(ptrLibrarianData->szLibraryName[0] != 0x00) + if(ptrLibrarianData->bpxType == UE_ON_LIB_UNLOAD || ptrLibrarianData->bpxType == UE_ON_LIB_ALL) { - if(lstrcmpiA(ptrLibrarianData->szLibraryName, szAnsiLibraryName) == NULL) + myCustomHandler = (fCustomHandler)(ptrLibrarianData->bpxCallBack); + __try { - if(ptrLibrarianData->bpxType == UE_ON_LIB_UNLOAD || ptrLibrarianData->bpxType == UE_ON_LIB_ALL) - { - myCustomHandler = (fCustomHandler)(ptrLibrarianData->bpxCallBack); - __try - { - myCustomHandler(&DBGEvent.u.UnloadDll); - } - __except(EXCEPTION_EXECUTE_HANDLER) - { - LibrarianRemoveBreakPoint(ptrLibrarianData->szLibraryName, ptrLibrarianData->bpxType); - } - if(ptrLibrarianData->bpxSingleShoot) - { - LibrarianRemoveBreakPoint(ptrLibrarianData->szLibraryName, ptrLibrarianData->bpxType); - } - } + myCustomHandler(&DBGEvent.u.UnloadDll); + } + __except(EXCEPTION_EXECUTE_HANDLER) + { + LibrarianRemoveBreakPoint(ptrLibrarianData->szLibraryName, ptrLibrarianData->bpxType); + } + if(ptrLibrarianData->bpxSingleShoot) + { + LibrarianRemoveBreakPoint(ptrLibrarianData->szLibraryName, ptrLibrarianData->bpxType); } } - ptrLibrarianData = (PLIBRARY_BREAK_DATA)((ULONG_PTR)ptrLibrarianData + sizeof LIBRARY_BREAK_DATA); - k++; } } } - hListLibraryPtr = (PLIBRARY_ITEM_DATAW)hListLibrary; - if(hListLibraryPtr != NULL) + + //maintain library list + int libcount=hListLibrary.size(); + for(int i=0; ihFile != NULL) + if(hListLibrary.at(i).BaseOfDll == DBGEvent.u.UnloadDll.lpBaseOfDll && + hListLibrary.at(i).hFile != INVALID_HANDLE_VALUE) { - if(hListLibraryPtr->BaseOfDll == DBGEvent.u.UnloadDll.lpBaseOfDll) + if(hListLibrary.at(i).hFileMappingView != NULL) { - if(hListLibraryPtr->hFile != (HANDLE)-1) - { - if(hListLibraryPtr->hFileMappingView != NULL) - { - UnmapViewOfFile(hListLibraryPtr->hFileMappingView); - EngineCloseHandle(hListLibraryPtr->hFileMapping); - } - EngineCloseHandle(hListLibraryPtr->hFile); - RtlZeroMemory(hListLibraryPtr, sizeof LIBRARY_ITEM_DATAW); - hListLibraryPtr->hFile = (HANDLE)-1; - } + UnmapViewOfFile(hListLibrary.at(i).hFileMappingView); + EngineCloseHandle(hListLibrary.at(i).hFileMapping); } - hListLibraryPtr = (PLIBRARY_ITEM_DATAW)((ULONG_PTR)hListLibraryPtr + sizeof LIBRARY_ITEM_DATAW); + EngineCloseHandle(hListLibrary.at(i).hFile); + hListLibrary.erase(hListLibrary.begin()+i); + break; } } } diff --git a/TitanEngine/TitanEngine.Importer.cpp b/TitanEngine/TitanEngine.Importer.cpp index 4141d89..d1e03fe 100644 --- a/TitanEngine/TitanEngine.Importer.cpp +++ b/TitanEngine/TitanEngine.Importer.cpp @@ -127,7 +127,6 @@ __declspec(dllexport) long long TITCALL ImporterGetRemoteAPIAddressEx(char* szDL int i = 0; int j = 0; char szAnsiLibraryName[MAX_PATH]; - PLIBRARY_ITEM_DATAW hListLibraryPtr = NULL; ULONG_PTR APIFoundAddress = 0; PIMAGE_DOS_HEADER DOSHeader; PIMAGE_NT_HEADERS32 PEHeader32; @@ -136,79 +135,77 @@ __declspec(dllexport) long long TITCALL ImporterGetRemoteAPIAddressEx(char* szDL PEXPORTED_DATA ExportedFunctions; PEXPORTED_DATA ExportedFunctionNames; PEXPORTED_DATA_WORD ExportedFunctionOrdinals; + PLIBRARY_ITEM_DATAW hListLibraryPtr; bool FileIs64 = false; - hListLibraryPtr = (PLIBRARY_ITEM_DATAW)hListLibrary; - if(hListLibraryPtr != NULL) + int libcount=hListLibrary.size(); + for(int i=0; ihFile != NULL) + hListLibraryPtr=&hListLibrary.at(i); + WideCharToMultiByte(CP_ACP, NULL, hListLibraryPtr->szLibraryName, -1, szAnsiLibraryName, sizeof szAnsiLibraryName, NULL, NULL); + if(lstrcmpiA(szAnsiLibraryName, szDLLName) == NULL) { - WideCharToMultiByte(CP_ACP, NULL, hListLibraryPtr->szLibraryName, -1, szAnsiLibraryName, sizeof szAnsiLibraryName, NULL, NULL); - if(lstrcmpiA(szAnsiLibraryName, szDLLName) == NULL) + __try { - __try + DOSHeader = (PIMAGE_DOS_HEADER)hListLibraryPtr->hFileMappingView; + PEHeader32 = (PIMAGE_NT_HEADERS32)((ULONG_PTR)DOSHeader + DOSHeader->e_lfanew); + PEHeader64 = (PIMAGE_NT_HEADERS64)((ULONG_PTR)DOSHeader + DOSHeader->e_lfanew); + if(PEHeader32->OptionalHeader.Magic == 0x10B) + { + FileIs64 = false; + } + else if(PEHeader32->OptionalHeader.Magic == 0x20B) + { + FileIs64 = true; + } + else + { + return(NULL); + } + if(!FileIs64) + { + PEExports = (PIMAGE_EXPORT_DIRECTORY)((ULONG_PTR)ConvertVAtoFileOffsetEx((ULONG_PTR)hListLibraryPtr->hFileMappingView, GetFileSize(hListLibraryPtr->hFile, NULL), (ULONG_PTR)PEHeader32->OptionalHeader.ImageBase, PEHeader32->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress, true, true)); + ExportedFunctions = (PEXPORTED_DATA)((ULONG_PTR)ConvertVAtoFileOffsetEx((ULONG_PTR)hListLibraryPtr->hFileMappingView, GetFileSize(hListLibraryPtr->hFile, NULL), (ULONG_PTR)PEHeader32->OptionalHeader.ImageBase, PEExports->AddressOfFunctions, true, true)); + ExportedFunctionNames = (PEXPORTED_DATA)((ULONG_PTR)ConvertVAtoFileOffsetEx((ULONG_PTR)hListLibraryPtr->hFileMappingView, GetFileSize(hListLibraryPtr->hFile, NULL), (ULONG_PTR)PEHeader32->OptionalHeader.ImageBase, PEExports->AddressOfNames, true, true)); + ExportedFunctionOrdinals = (PEXPORTED_DATA_WORD)((ULONG_PTR)ConvertVAtoFileOffsetEx((ULONG_PTR)hListLibraryPtr->hFileMappingView, GetFileSize(hListLibraryPtr->hFile, NULL), (ULONG_PTR)PEHeader32->OptionalHeader.ImageBase, PEExports->AddressOfNameOrdinals, true, true)); + } + else + { + PEExports = (PIMAGE_EXPORT_DIRECTORY)((ULONG_PTR)ConvertVAtoFileOffsetEx((ULONG_PTR)hListLibraryPtr->hFileMappingView, GetFileSize(hListLibraryPtr->hFile, NULL), (ULONG_PTR)PEHeader64->OptionalHeader.ImageBase, PEHeader64->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress, true, true)); + ExportedFunctions = (PEXPORTED_DATA)((ULONG_PTR)ConvertVAtoFileOffsetEx((ULONG_PTR)hListLibraryPtr->hFileMappingView, GetFileSize(hListLibraryPtr->hFile, NULL), (ULONG_PTR)PEHeader64->OptionalHeader.ImageBase, PEExports->AddressOfFunctions, true, true)); + ExportedFunctionNames = (PEXPORTED_DATA)((ULONG_PTR)ConvertVAtoFileOffsetEx((ULONG_PTR)hListLibraryPtr->hFileMappingView, GetFileSize(hListLibraryPtr->hFile, NULL), (ULONG_PTR)PEHeader64->OptionalHeader.ImageBase, PEExports->AddressOfNames, true, true)); + ExportedFunctionOrdinals = (PEXPORTED_DATA_WORD)((ULONG_PTR)ConvertVAtoFileOffsetEx((ULONG_PTR)hListLibraryPtr->hFileMappingView, GetFileSize(hListLibraryPtr->hFile, NULL), (ULONG_PTR)PEHeader64->OptionalHeader.ImageBase, PEExports->AddressOfNameOrdinals, true, true)); + } + for(j = 0; j <= (int)PEExports->NumberOfNames; j++) { - DOSHeader = (PIMAGE_DOS_HEADER)hListLibraryPtr->hFileMappingView; - PEHeader32 = (PIMAGE_NT_HEADERS32)((ULONG_PTR)DOSHeader + DOSHeader->e_lfanew); - PEHeader64 = (PIMAGE_NT_HEADERS64)((ULONG_PTR)DOSHeader + DOSHeader->e_lfanew); - if(PEHeader32->OptionalHeader.Magic == 0x10B) - { - FileIs64 = false; - } - else if(PEHeader32->OptionalHeader.Magic == 0x20B) - { - FileIs64 = true; - } - else - { - return(NULL); - } if(!FileIs64) { - PEExports = (PIMAGE_EXPORT_DIRECTORY)((ULONG_PTR)ConvertVAtoFileOffsetEx((ULONG_PTR)hListLibraryPtr->hFileMappingView, GetFileSize(hListLibraryPtr->hFile, NULL), (ULONG_PTR)PEHeader32->OptionalHeader.ImageBase, PEHeader32->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress, true, true)); - ExportedFunctions = (PEXPORTED_DATA)((ULONG_PTR)ConvertVAtoFileOffsetEx((ULONG_PTR)hListLibraryPtr->hFileMappingView, GetFileSize(hListLibraryPtr->hFile, NULL), (ULONG_PTR)PEHeader32->OptionalHeader.ImageBase, PEExports->AddressOfFunctions, true, true)); - ExportedFunctionNames = (PEXPORTED_DATA)((ULONG_PTR)ConvertVAtoFileOffsetEx((ULONG_PTR)hListLibraryPtr->hFileMappingView, GetFileSize(hListLibraryPtr->hFile, NULL), (ULONG_PTR)PEHeader32->OptionalHeader.ImageBase, PEExports->AddressOfNames, true, true)); - ExportedFunctionOrdinals = (PEXPORTED_DATA_WORD)((ULONG_PTR)ConvertVAtoFileOffsetEx((ULONG_PTR)hListLibraryPtr->hFileMappingView, GetFileSize(hListLibraryPtr->hFile, NULL), (ULONG_PTR)PEHeader32->OptionalHeader.ImageBase, PEExports->AddressOfNameOrdinals, true, true)); + if(lstrcmpiA((LPCSTR)szAPIName, (LPCSTR)((ULONG_PTR)ConvertVAtoFileOffsetEx((ULONG_PTR)hListLibraryPtr->hFileMappingView, GetFileSize(hListLibraryPtr->hFile, NULL), (ULONG_PTR)PEHeader32->OptionalHeader.ImageBase, ExportedFunctionNames->ExportedItem, true, true))) == NULL) + { + ExportedFunctionOrdinals = (PEXPORTED_DATA_WORD)((ULONG_PTR)ExportedFunctionOrdinals + j * 2); + ExportedFunctions = (PEXPORTED_DATA)((ULONG_PTR)ExportedFunctions + (ExportedFunctionOrdinals->OrdinalNumber) * 4); + APIFoundAddress = ExportedFunctions->ExportedItem + (ULONG_PTR)hListLibraryPtr->BaseOfDll; + return((ULONG_PTR)APIFoundAddress); + } } else { - PEExports = (PIMAGE_EXPORT_DIRECTORY)((ULONG_PTR)ConvertVAtoFileOffsetEx((ULONG_PTR)hListLibraryPtr->hFileMappingView, GetFileSize(hListLibraryPtr->hFile, NULL), (ULONG_PTR)PEHeader64->OptionalHeader.ImageBase, PEHeader64->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress, true, true)); - ExportedFunctions = (PEXPORTED_DATA)((ULONG_PTR)ConvertVAtoFileOffsetEx((ULONG_PTR)hListLibraryPtr->hFileMappingView, GetFileSize(hListLibraryPtr->hFile, NULL), (ULONG_PTR)PEHeader64->OptionalHeader.ImageBase, PEExports->AddressOfFunctions, true, true)); - ExportedFunctionNames = (PEXPORTED_DATA)((ULONG_PTR)ConvertVAtoFileOffsetEx((ULONG_PTR)hListLibraryPtr->hFileMappingView, GetFileSize(hListLibraryPtr->hFile, NULL), (ULONG_PTR)PEHeader64->OptionalHeader.ImageBase, PEExports->AddressOfNames, true, true)); - ExportedFunctionOrdinals = (PEXPORTED_DATA_WORD)((ULONG_PTR)ConvertVAtoFileOffsetEx((ULONG_PTR)hListLibraryPtr->hFileMappingView, GetFileSize(hListLibraryPtr->hFile, NULL), (ULONG_PTR)PEHeader64->OptionalHeader.ImageBase, PEExports->AddressOfNameOrdinals, true, true)); - } - for(j = 0; j <= (int)PEExports->NumberOfNames; j++) - { - if(!FileIs64) + if(lstrcmpiA((LPCSTR)szAPIName, (LPCSTR)((ULONG_PTR)ConvertVAtoFileOffsetEx((ULONG_PTR)hListLibraryPtr->hFileMappingView, GetFileSize(hListLibraryPtr->hFile, NULL), (ULONG_PTR)PEHeader64->OptionalHeader.ImageBase, ExportedFunctionNames->ExportedItem, true, true))) == NULL) { - if(lstrcmpiA((LPCSTR)szAPIName, (LPCSTR)((ULONG_PTR)ConvertVAtoFileOffsetEx((ULONG_PTR)hListLibraryPtr->hFileMappingView, GetFileSize(hListLibraryPtr->hFile, NULL), (ULONG_PTR)PEHeader32->OptionalHeader.ImageBase, ExportedFunctionNames->ExportedItem, true, true))) == NULL) - { - ExportedFunctionOrdinals = (PEXPORTED_DATA_WORD)((ULONG_PTR)ExportedFunctionOrdinals + j * 2); - ExportedFunctions = (PEXPORTED_DATA)((ULONG_PTR)ExportedFunctions + (ExportedFunctionOrdinals->OrdinalNumber) * 4); - APIFoundAddress = ExportedFunctions->ExportedItem + (ULONG_PTR)hListLibraryPtr->BaseOfDll; - return((ULONG_PTR)APIFoundAddress); - } + ExportedFunctionOrdinals = (PEXPORTED_DATA_WORD)((ULONG_PTR)ExportedFunctionOrdinals + j * 2); + ExportedFunctions = (PEXPORTED_DATA)((ULONG_PTR)ExportedFunctions + (ExportedFunctionOrdinals->OrdinalNumber) * 4); + APIFoundAddress = ExportedFunctions->ExportedItem + (ULONG_PTR)hListLibraryPtr->BaseOfDll; + return((ULONG_PTR)APIFoundAddress); } - else - { - if(lstrcmpiA((LPCSTR)szAPIName, (LPCSTR)((ULONG_PTR)ConvertVAtoFileOffsetEx((ULONG_PTR)hListLibraryPtr->hFileMappingView, GetFileSize(hListLibraryPtr->hFile, NULL), (ULONG_PTR)PEHeader64->OptionalHeader.ImageBase, ExportedFunctionNames->ExportedItem, true, true))) == NULL) - { - ExportedFunctionOrdinals = (PEXPORTED_DATA_WORD)((ULONG_PTR)ExportedFunctionOrdinals + j * 2); - ExportedFunctions = (PEXPORTED_DATA)((ULONG_PTR)ExportedFunctions + (ExportedFunctionOrdinals->OrdinalNumber) * 4); - APIFoundAddress = ExportedFunctions->ExportedItem + (ULONG_PTR)hListLibraryPtr->BaseOfDll; - return((ULONG_PTR)APIFoundAddress); - } - } - ExportedFunctionNames = (PEXPORTED_DATA)((ULONG_PTR)ExportedFunctionNames + 4); } - return(NULL); - } - __except(EXCEPTION_EXECUTE_HANDLER) - { - return(NULL); + ExportedFunctionNames = (PEXPORTED_DATA)((ULONG_PTR)ExportedFunctionNames + 4); } + return(NULL); + } + __except(EXCEPTION_EXECUTE_HANDLER) + { + return(NULL); } - hListLibraryPtr = (PLIBRARY_ITEM_DATAW)((ULONG_PTR)hListLibraryPtr + sizeof LIBRARY_ITEM_DATAW); } } return(NULL); diff --git a/TitanEngine/TitanEngine.Librarian.cpp b/TitanEngine/TitanEngine.Librarian.cpp index cb05908..9ea8342 100644 --- a/TitanEngine/TitanEngine.Librarian.cpp +++ b/TitanEngine/TitanEngine.Librarian.cpp @@ -2,116 +2,41 @@ #include "definitions.h" #include "Global.Librarian.h" +static LIBRARY_ITEM_DATA LibraryInfoData = {}; + // TitanEngine.Librarian.functions: __declspec(dllexport) bool TITCALL LibrarianSetBreakPoint(char* szLibraryName, DWORD bpxType, bool SingleShoot, LPVOID bpxCallBack) { - - int i = MAX_LIBRARY_BPX; - PLIBRARY_BREAK_DATA ptrLibrarianData = (PLIBRARY_BREAK_DATA)LibrarianData; - - if(szLibraryName != NULL && ptrLibrarianData != NULL) - { - while(i > NULL && ptrLibrarianData->szLibraryName[0] != 0x00) - { - ptrLibrarianData = (PLIBRARY_BREAK_DATA)((ULONG_PTR)ptrLibrarianData + sizeof LIBRARY_BREAK_DATA); - i--; - } - lstrcpyA(&ptrLibrarianData->szLibraryName[0], szLibraryName); - ptrLibrarianData->bpxCallBack = bpxCallBack; - ptrLibrarianData->bpxSingleShoot = SingleShoot; - ptrLibrarianData->bpxType = bpxType; - return true; - } - return false; + LIBRARY_BREAK_DATA NewLibrarianData; + memset(&NewLibrarianData, 0, sizeof(LIBRARY_BREAK_DATA)); + lstrcpyA(NewLibrarianData.szLibraryName, szLibraryName); + NewLibrarianData.bpxCallBack = bpxCallBack; + NewLibrarianData.bpxSingleShoot = SingleShoot; + NewLibrarianData.bpxType = bpxType; + LibrarianData.push_back(NewLibrarianData); + return true; } __declspec(dllexport) bool TITCALL LibrarianRemoveBreakPoint(char* szLibraryName, DWORD bpxType) { - - int i = MAX_LIBRARY_BPX; - PLIBRARY_BREAK_DATA ptrLibrarianData = (PLIBRARY_BREAK_DATA)LibrarianData; - - if(szLibraryName != NULL && ptrLibrarianData != NULL) - { - while(i > NULL) + int libbpcount=LibrarianData.size(); + for(int i=libbpcount=1; i>-1; i--) + if(!lstrcmpiA(szLibraryName, LibrarianData.at(i).szLibraryName) && (LibrarianData.at(i).bpxType == bpxType || bpxType == UE_ON_LIB_ALL)) { - if(ptrLibrarianData->szLibraryName[0] != 0x00) - { - if(lstrcmpiA(szLibraryName, ptrLibrarianData->szLibraryName) == NULL && (ptrLibrarianData->bpxType == bpxType || bpxType == UE_ON_LIB_ALL)) - { - RtlZeroMemory(ptrLibrarianData, sizeof LIBRARY_BREAK_DATA); - } - } - ptrLibrarianData = (PLIBRARY_BREAK_DATA)((ULONG_PTR)ptrLibrarianData + sizeof LIBRARY_BREAK_DATA); - i--; + LibrarianData.erase(LibrarianData.begin()+i); } - return true; - } - return false; + return true; } __declspec(dllexport) void* TITCALL LibrarianGetLibraryInfo(char* szLibraryName) { - + if(!szLibraryName) + return NULL; wchar_t uniLibraryName[MAX_PATH] = {}; PLIBRARY_ITEM_DATAW LibInfo; - - if(szLibraryName != NULL) - { - MultiByteToWideChar(CP_ACP, NULL, szLibraryName, lstrlenA(szLibraryName)+1, uniLibraryName, sizeof(uniLibraryName)/(sizeof(uniLibraryName[0]))); - LibInfo = (PLIBRARY_ITEM_DATAW)LibrarianGetLibraryInfoW(uniLibraryName); - if(LibInfo != NULL) - { - RtlZeroMemory(&LibraryInfoData, sizeof LIBRARY_ITEM_DATA); - LibraryInfoData.hFile = LibInfo->hFile; - LibraryInfoData.BaseOfDll = LibInfo->BaseOfDll; - LibraryInfoData.hFileMapping = LibInfo->hFileMapping; - LibraryInfoData.hFileMappingView = LibInfo->hFileMappingView; - WideCharToMultiByte(CP_ACP, NULL, LibInfo->szLibraryName, -1, &LibraryInfoData.szLibraryName[0], sizeof LibraryInfoData.szLibraryName, NULL, NULL); - WideCharToMultiByte(CP_ACP, NULL, LibInfo->szLibraryPath, -1, &LibraryInfoData.szLibraryPath[0], sizeof LibraryInfoData.szLibraryPath, NULL, NULL); - return((void*)&LibraryInfoData); - } - else - { - return(NULL); - } - } - else - { - return(NULL); - } -} - -__declspec(dllexport) void* TITCALL LibrarianGetLibraryInfoW(wchar_t* szLibraryName) -{ - - PLIBRARY_ITEM_DATAW hListLibraryPtr = NULL; - - if(hListLibrary != NULL) - { - hListLibraryPtr = (PLIBRARY_ITEM_DATAW)hListLibrary; - while(hListLibraryPtr->hFile != NULL) - { - if(hListLibraryPtr->hFile != (HANDLE)-1) - { - if(lstrcmpiW(hListLibraryPtr->szLibraryName, szLibraryName) == NULL) - { - return((void*)hListLibraryPtr); - } - } - hListLibraryPtr = (PLIBRARY_ITEM_DATAW)((ULONG_PTR)hListLibraryPtr + sizeof LIBRARY_ITEM_DATAW); - } - } - return(NULL); -} - -__declspec(dllexport) void* TITCALL LibrarianGetLibraryInfoEx(void* BaseOfDll) -{ - - PLIBRARY_ITEM_DATAW LibInfo; - - LibInfo = (PLIBRARY_ITEM_DATAW)LibrarianGetLibraryInfoExW(BaseOfDll); - if(LibInfo != NULL) + MultiByteToWideChar(CP_ACP, NULL, szLibraryName, lstrlenA(szLibraryName)+1, uniLibraryName, sizeof(uniLibraryName)/(sizeof(uniLibraryName[0]))); + LibInfo = (PLIBRARY_ITEM_DATAW)LibrarianGetLibraryInfoW(uniLibraryName); + if(LibInfo) { RtlZeroMemory(&LibraryInfoData, sizeof LIBRARY_ITEM_DATA); LibraryInfoData.hFile = LibInfo->hFile; @@ -122,95 +47,101 @@ __declspec(dllexport) void* TITCALL LibrarianGetLibraryInfoEx(void* BaseOfDll) WideCharToMultiByte(CP_ACP, NULL, LibInfo->szLibraryPath, -1, &LibraryInfoData.szLibraryPath[0], sizeof LibraryInfoData.szLibraryPath, NULL, NULL); return((void*)&LibraryInfoData); } - else - { - return(NULL); - } + return(NULL); } -__declspec(dllexport) void* TITCALL LibrarianGetLibraryInfoExW(void* BaseOfDll) +__declspec(dllexport) void* TITCALL LibrarianGetLibraryInfoW(wchar_t* szLibraryName) { - - PLIBRARY_ITEM_DATAW hListLibraryPtr = NULL; - - if(hListLibrary != NULL) - { - hListLibraryPtr = (PLIBRARY_ITEM_DATAW)hListLibrary; - while(hListLibraryPtr->hFile != NULL) + static LIBRARY_ITEM_DATAW LibraryInfo; + memset(&LibraryInfo, 0, sizeof(LIBRARY_ITEM_DATAW)); + int libcount=hListLibrary.size(); + for(int i=0; ihFile != (HANDLE)-1) - { - if(hListLibraryPtr->BaseOfDll == BaseOfDll) - { - return((void*)hListLibraryPtr); - } - } - hListLibraryPtr = (PLIBRARY_ITEM_DATAW)((ULONG_PTR)hListLibraryPtr + sizeof LIBRARY_ITEM_DATAW); + memcpy(&LibraryInfo, &hListLibrary.at(i), sizeof(LIBRARY_ITEM_DATAW)); + return &LibraryInfo; } + return NULL; +} + +__declspec(dllexport) void* TITCALL LibrarianGetLibraryInfoEx(void* BaseOfDll) +{ + PLIBRARY_ITEM_DATAW LibInfo; + LibInfo = (PLIBRARY_ITEM_DATAW)LibrarianGetLibraryInfoExW(BaseOfDll); + if(LibInfo) + { + RtlZeroMemory(&LibraryInfoData, sizeof LIBRARY_ITEM_DATA); + LibraryInfoData.hFile = LibInfo->hFile; + LibraryInfoData.BaseOfDll = LibInfo->BaseOfDll; + LibraryInfoData.hFileMapping = LibInfo->hFileMapping; + LibraryInfoData.hFileMappingView = LibInfo->hFileMappingView; + WideCharToMultiByte(CP_ACP, NULL, LibInfo->szLibraryName, -1, &LibraryInfoData.szLibraryName[0], sizeof LibraryInfoData.szLibraryName, NULL, NULL); + WideCharToMultiByte(CP_ACP, NULL, LibInfo->szLibraryPath, -1, &LibraryInfoData.szLibraryPath[0], sizeof LibraryInfoData.szLibraryPath, NULL, NULL); + return((void*)&LibraryInfoData); } return(NULL); } +__declspec(dllexport) void* TITCALL LibrarianGetLibraryInfoExW(void* BaseOfDll) +{ + static LIBRARY_ITEM_DATAW LibraryData; + memset(&LibraryData, 0, sizeof(LIBRARY_ITEM_DATAW)); + int libcount=hListLibrary.size(); + for(int i=0; ihFile != NULL) + int libcount=hListLibrary.size(); + for(int i=0; ihFile != (HANDLE)-1) + __try { - __try - { - myEnumCallBack((void*)hListLibraryPtr); - } - __except(EXCEPTION_EXECUTE_HANDLER) - { - EnumCallBack = NULL; - } + LIBRARY_ITEM_DATA myLibraryInfoData; + memset(&myLibraryInfoData, 0, sizeof(LIBRARY_ITEM_DATA)); + myLibraryInfoData.hFile = hListLibrary.at(i).hFile; + myLibraryInfoData.BaseOfDll = hListLibrary.at(i).BaseOfDll; + myLibraryInfoData.hFileMapping = hListLibrary.at(i).hFileMapping; + myLibraryInfoData.hFileMappingView = hListLibrary.at(i).hFileMappingView; + WideCharToMultiByte(CP_ACP, NULL, hListLibrary.at(i).szLibraryName, -1, &myLibraryInfoData.szLibraryName[0], sizeof(myLibraryInfoData.szLibraryName), NULL, NULL); + WideCharToMultiByte(CP_ACP, NULL, hListLibrary.at(i).szLibraryPath, -1, &myLibraryInfoData.szLibraryPath[0], sizeof(myLibraryInfoData.szLibraryPath), NULL, NULL); + myEnumCallBack(&myLibraryInfoData); + } + __except(EXCEPTION_EXECUTE_HANDLER) + { + break; } - hListLibraryPtr = (PLIBRARY_ITEM_DATAW)((ULONG_PTR)hListLibraryPtr + sizeof LIBRARY_ITEM_DATAW); } - } } __declspec(dllexport) void TITCALL LibrarianEnumLibraryInfoW(void* EnumCallBack) { - - LIBRARY_ITEM_DATA myLibraryInfoData; - PLIBRARY_ITEM_DATAW hListLibraryPtr = NULL; + if(!EnumCallBack) + return; typedef void(TITCALL *fEnumCallBack)(LPVOID fLibraryDetail); fEnumCallBack myEnumCallBack = (fEnumCallBack)EnumCallBack; - - if(hListLibrary != NULL) - { - hListLibraryPtr = (PLIBRARY_ITEM_DATAW)hListLibrary; - while(EnumCallBack != NULL && hListLibraryPtr->hFile != NULL) + int libcount=hListLibrary.size(); + for(int i=0; ihFile != (HANDLE)-1) + __try { - __try - { - RtlZeroMemory(&myLibraryInfoData, sizeof LIBRARY_ITEM_DATA); - myLibraryInfoData.hFile = hListLibraryPtr->hFile; - myLibraryInfoData.BaseOfDll = hListLibraryPtr->BaseOfDll; - myLibraryInfoData.hFileMapping = hListLibraryPtr->hFileMapping; - myLibraryInfoData.hFileMappingView = hListLibraryPtr->hFileMappingView; - WideCharToMultiByte(CP_ACP, NULL, hListLibraryPtr->szLibraryName, -1, &myLibraryInfoData.szLibraryName[0], sizeof myLibraryInfoData.szLibraryName, NULL, NULL); - WideCharToMultiByte(CP_ACP, NULL, hListLibraryPtr->szLibraryPath, -1, &myLibraryInfoData.szLibraryPath[0], sizeof myLibraryInfoData.szLibraryPath, NULL, NULL); - myEnumCallBack((void*)&myLibraryInfoData); - } - __except(EXCEPTION_EXECUTE_HANDLER) - { - EnumCallBack = NULL; - } + myEnumCallBack(&hListLibrary.at(i)); + } + __except(EXCEPTION_EXECUTE_HANDLER) + { + break; } - hListLibraryPtr = (PLIBRARY_ITEM_DATAW)((ULONG_PTR)hListLibraryPtr + sizeof LIBRARY_ITEM_DATAW); } - } } diff --git a/TitanEngine/TitanEngine.Threader.cpp b/TitanEngine/TitanEngine.Threader.cpp index 9b27c5d..0ce7948 100644 --- a/TitanEngine/TitanEngine.Threader.cpp +++ b/TitanEngine/TitanEngine.Threader.cpp @@ -201,7 +201,7 @@ __declspec(dllexport) bool TITCALL ThreaderIsThreadStillRunning(HANDLE hThread) CONTEXT myDBGContext; memset(&myDBGContext, 0, sizeof(CONTEXT)); myDBGContext.ContextFlags = CONTEXT_ALL; - return GetThreadContext(hThread, &myDBGContext); + return (GetThreadContext(hThread, &myDBGContext)==TRUE); } __declspec(dllexport) bool TITCALL ThreaderIsThreadActive(HANDLE hThread) @@ -220,7 +220,7 @@ __declspec(dllexport) bool TITCALL ThreaderIsAnyThreadActive() for(int i=0; i