pcieドライバはブルースクリーンをアンマウントします。
pcieドライバをアンインストールする時、たまにブルースクリーンが現れます。プリント情報によって、リソースをリリースする時にエラーが発生しました。Windbgを使ってシングルステップでデバッグする場合、ブルースクリーンの確率は高いです。 コードは以下の通りです
問題の原因:IO/メモリリソースがリリースされた後、リソースのリリースが中断される前の期間に、他のデバイスが割り込み発生(共有中断)したため、駆動処理プログラムのレジスタ操作により、ブルースクリーンが発生しました。
解決方法:IO/メモリリソースと割込みリソースのリリース位置を切り替える(割込みリソースをリリースしてIO/メモリリソースを解放する)。
VOID PciReturnResources(PPCI_DEVICE_EXT pDevExt)
{
int i;
{// Release IO/Memory Resource
for(i=0; ibase[i].WhichMapped == TYPE_MEM)
{
MmUnmapIoSpace(pDevExt->base[i].MemoryMappedAddress, pDevExt->base[i].MemorySize);
}
if(pDevExt->base[i].WhichMapped == TYPE_IO)
{
pDevExt->base[i].IoPortMappedAddress = (PVOID)0;
}
pDevExt->base[i].WhichMapped = TYPE_NONE;
}
}
{// Release Interrupt Resource
if(pDevExt->InterruptObject != NULL)
{
IoDisconnectInterrupt(pDevExt->InterruptObject);
pDevExt->InterruptObject = NULL;
}
}
{// Release Adapter Resource
if(pDevExt->DmaAdapter != NULL)
{
(*pDevExt->DmaAdapter->DmaOperations->PutDmaAdapter)(pDevExt->DmaAdapter);
}
}
}
コードを詳しく分析した結果、次のようになります。問題の原因:IO/メモリリソースがリリースされた後、リソースのリリースが中断される前の期間に、他のデバイスが割り込み発生(共有中断)したため、駆動処理プログラムのレジスタ操作により、ブルースクリーンが発生しました。
解決方法:IO/メモリリソースと割込みリソースのリリース位置を切り替える(割込みリソースをリリースしてIO/メモリリソースを解放する)。