Skip to content

Commit

Permalink
EmulatorPkg/Win: Unload DLLs before reset
Browse files Browse the repository at this point in the history
EmulatorPkg/Win calls LoadLibraryEx() when the corresponding DLL file
is found for each PEIM or DXE driver. The module entry point is
changed to point to the entry point from the DLL. This helps to
notify Visual Studio that a new windows module is loaded and
corresponding symbol parsing is performed for source level debugging.

But entry point from the DLL is only executed when the module is not
loaded by AddModHandle().
When reset happens, we need to clear the DLL loading so that in next
boot the module can be loaded again by AddModHandle().

Without this patch, source level debugging doesn't work after reset.

Signed-off-by: Ray Ni <[email protected]>
Reviewed-by: Zhiguang Liu <[email protected]>
Cc: Andrew Fish <[email protected]>
  • Loading branch information
niruiyu authored and mergify[bot] committed Dec 8, 2022
1 parent 2280af5 commit 4e17aba
Showing 1 changed file with 14 additions and 0 deletions.
14 changes: 14 additions & 0 deletions EmulatorPkg/Win/Host/WinHost.c
Original file line number Diff line number Diff line change
Expand Up @@ -226,12 +226,26 @@ WinReset (
IN VOID *ResetData OPTIONAL
)
{
UINTN Index;

ASSERT (ResetType <= EfiResetPlatformSpecific);
SecPrint (" Emu ResetSystem is called: ResetType = %s\n", mResetTypeStr[ResetType]);

if (ResetType == EfiResetShutdown) {
exit (0);
} else {
//
// Unload all DLLs
//
for (Index = 0; Index < mPdbNameModHandleArraySize; Index++) {
if (mPdbNameModHandleArray[Index].PdbPointer != NULL) {
SecPrint (" Emu Unload DLL: %s\n", mPdbNameModHandleArray[Index].PdbPointer);
FreeLibrary (mPdbNameModHandleArray[Index].ModHandle);
HeapFree (GetProcessHeap (), 0, mPdbNameModHandleArray[Index].PdbPointer);
mPdbNameModHandleArray[Index].PdbPointer = NULL;
}
}

//
// Jump back to SetJump with jump code = ResetType + 1
//
Expand Down

0 comments on commit 4e17aba

Please sign in to comment.