/* * module.c - Module functions of DBG DLL. * * */ #include #pragma hdrstop VOID WINAPI xxxDbgDosAppStart( WORD wCS, WORD wIP ) { if ( fDebugged ) { if (VdmDbgTraceFlags & VDMDBG_BREAK_DOSTASK) { DbgSetTemporaryBP(wCS, wIP, FALSE); } } } BOOL DbgDllStart( PNDFRAME16 pNDFrame ) { BOOL fResult; fResult = FALSE; // Default to Event not handled if ( fDebugged ) { LPSTR lpModuleName; LPSTR lpModulePath; UINT length; UCHAR fPE; IMAGE_NOTE im; DbgGetContext(); EventParams[2] = (DWORD)&im; // Get the module's path and name fPE = ISPESET; lpModuleName = (LPSTR)Sim32GetVDMPointer( (ULONG)pNDFrame->dwModuleName, MAX_MODULE, fPE ); lpModulePath = (LPSTR)Sim32GetVDMPointer( (ULONG)pNDFrame->dwModulePath, MAX_PATH, fPE ); length = (UINT)((UCHAR)*lpModuleName++); strncpy( im.Module, lpModuleName, length ); im.Module[length] = '\0'; length = (UINT)((UCHAR)*lpModulePath); lpModulePath += 8; length -= 8; strncpy( im.FileName, lpModulePath, length ); im.FileName[length] = '\0'; im.hModule = pNDFrame->hModule; im.hTask = pNDFrame->hTask; fResult = SendVDMEvent(DBG_DLLSTART); if (VdmDbgTraceFlags & VDMDBG_BREAK_LOADDLL) { DbgSetTemporaryBP(pNDFrame->wCS, pNDFrame->wIP, (BOOL)(getMSW() & MSW_PE)); } } return( fResult ); } BOOL DbgTaskStop( PSTFRAME16 pSTFrame ) { BOOL fResult; fResult = FALSE; // Default to Event not handled if ( fDebugged ) { LPSTR lpModuleName; LPSTR lpModulePath; UINT length; UCHAR fPE; IMAGE_NOTE im; DbgGetContext(); EventParams[2] = (DWORD)&im; // The code in TASK.ASM pops the frame off the stack before it IRETs vcContext.Esp += sizeof(STFRAME16); // Get the module's path and name fPE = ISPESET; lpModuleName = (LPSTR)Sim32GetVDMPointer( (ULONG)pSTFrame->dwModuleName, MAX_MODULE, fPE ); lpModulePath = (LPSTR)Sim32GetVDMPointer( (ULONG)pSTFrame->dwModulePath, MAX_PATH, fPE ); length = (UINT)((UCHAR)*lpModuleName++); strncpy( im.Module, lpModuleName, length ); im.Module[length] = '\0'; length = (UINT)((UCHAR)*lpModulePath); lpModulePath += 8; length -= 8; strncpy( im.FileName, lpModulePath, length ); im.FileName[length] = '\0'; im.hModule = pSTFrame->hModule; im.hTask = pSTFrame->hTask; fResult = SendVDMEvent(DBG_TASKSTOP); // See comment about what the code does above vcContext.Esp -= sizeof(STFRAME16); } return( fResult ); } VOID xxxDbgNotifyNewTask( LPVOID lpvNTFrame, UINT uFrameSize ) { BOOL fResult; PNTFRAME16 pNTFrame; pNTFrame = (PNTFRAME16)lpvNTFrame; if ( fDebugged ) { LPSTR lpModuleName; LPSTR lpModulePath; UINT length; UCHAR fPE; IMAGE_NOTE im; DbgGetContext(); EventParams[2] = (DWORD)&im; // Get the module's path and name fPE = ISPESET; lpModuleName = (LPSTR)Sim32GetVDMPointer( (ULONG)pNTFrame->dwModuleName, MAX_MODULE, fPE ); lpModulePath = (LPSTR)Sim32GetVDMPointer( (ULONG)pNTFrame->dwModulePath, MAX_PATH, fPE ); length = (UINT)((UCHAR)*lpModuleName++); strncpy( im.Module, lpModuleName, length ); im.Module[length] = '\0'; length = (UINT)((UCHAR)*lpModulePath); lpModulePath += 8; length -= 8; strncpy( im.FileName, lpModulePath, length ); im.FileName[length] = '\0'; im.hModule = pNTFrame->hModule; im.hTask = pNTFrame->hTask; fResult = SendVDMEvent(DBG_TASKSTART); if (VdmDbgTraceFlags & VDMDBG_BREAK_WOWTASK) { DbgSetTemporaryBP(pNTFrame->wCS, pNTFrame->wIP, (BOOL)(getMSW() & MSW_PE)); } } }