Unhook interrupts from every driver on crash

This commit is contained in:
Alex 2023-03-27 20:30:03 +03:00
parent 93afcd2210
commit 98677c7b5b
Signed by untrusted user who does not match committer: enderice2
GPG Key ID: EACC3AD603BAB4DD
3 changed files with 24 additions and 1 deletions

View File

@ -917,7 +917,7 @@ namespace CrashHandler
ExceptionOccurred = true;
if (DriverManager)
DriverManager->UnloadAllDrivers();
DriverManager->Panic();
debug("Reading control registers...");
crashdata.Frame = Frame;

View File

@ -29,6 +29,28 @@ namespace Driver
"Input",
"Audio"};
void Driver::Panic()
{
size_t DriversNum = Drivers.size();
debug("%ld drivers loaded, [DUIDs: %ld]", DriversNum, DriverUIDs);
debug("driver size %ld", DriversNum);
for (size_t i = 0; i < DriversNum; i++)
{
DriverFile drv = Drivers[i];
KernelCallback callback;
callback.Reason = StopReason;
debug("Removing interrupt hook for %ld [%#lx]", drv.DriverUID, drv.Address);
DriverManager->IOCB(drv.DriverUID, (void *)&callback);
for (size_t j = 0; j < sizeof(drv.InterruptHook) / sizeof(drv.InterruptHook[0]); j++)
{
if (!drv.InterruptHook[j])
continue;
delete drv.InterruptHook[j], drv.InterruptHook[j] = nullptr;
}
}
}
void Driver::UnloadAllDrivers()
{
size_t DriversNum = Drivers.size();

View File

@ -102,6 +102,7 @@ namespace Driver
public:
std::vector<DriverFile> GetDrivers() { return Drivers; }
void Panic();
void UnloadAllDrivers();
bool UnloadDriver(unsigned long DUID);
int IOCB(unsigned long DUID, /* KernelCallback */ void *KCB);