Стимуляторы вызывают BSOD

Я создал драйвер промежуточного фильтра NDIS5 с именем fxwrap.sys, однако при его удалении. Windows вызывает BSOD. Также кажется, что ndis!ndisOidRequestComplete читает нулевой адрес из файла дампа. Я хочу знать, вызвана ли эта проблема fxwrap или другими вещами.

ENV: Windows 7 Ultimate 7601


Вот исходный код функции fxwrap!PtRequestComplete:

VOID PtRequestComplete(NDIS_HANDLE   ProtocolBindingContext,
                        PNDIS_REQUEST NdisRequest,
                        NDIS_STATUS   Status)
{
    PADAPT      pAdapt  = (PADAPT)ProtocolBindingContext;
    NDIS_OID    Oid     = pAdapt->Request.DATA.SET_INFORMATION.Oid ;

    NdisAcquireSpinLock(&pAdapt->AdaptDataLock);
    {
        pAdapt->OutstandingRequests = FALSE;
    }
    NdisReleaseSpinLock(&pAdapt->AdaptDataLock);

    switch(NdisRequest->RequestType)
    {
    case NdisRequestQueryInformation:
        {
            if(Oid == OID_TCP_TASK_OFFLOAD)
            {
                Status = NDIS_STATUS_FAILURE;
            }

            ASSERT(Oid != OID_PNP_QUERY_POWER);

            if(Oid == OID_PNP_CAPABILITIES && Status == NDIS_STATUS_SUCCESS)
            {
                MPQueryPNPCapbilities(pAdapt, &Status);
            }

            *pAdapt->BytesReadOrWritten = NdisRequest->DATA.QUERY_INFORMATION.BytesWritten;
            *pAdapt->BytesNeeded        = NdisRequest->DATA.QUERY_INFORMATION.BytesNeeded;

            NdisMQueryInformationComplete(pAdapt->MiniportHandle, Status);
        } break;
    case NdisRequestSetInformation:
        {
            ASSERT( Oid != OID_PNP_SET_POWER);

            *pAdapt->BytesReadOrWritten = NdisRequest->DATA.SET_INFORMATION.BytesRead;
            *pAdapt->BytesNeeded        = NdisRequest->DATA.SET_INFORMATION.BytesNeeded;
            NdisMSetInformationComplete(pAdapt->MiniportHandle, Status);
        }break;
    default:
        ASSERT(0);
        break;
    }
}

Ниже приведена информация о дампе:

DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1) Была предпринята попытка получить доступ к адресу страницы (или полностью недопустимому) на слишком высоком уровне запроса прерывания (IRQL). Это обычно вызывается драйверами, использующими неправильные адреса. Если доступен отладчик ядра, получите возврат стека. Аргументы: Arg1: 00000000, ссылка на память Arg2: 00000002, IRQL Arg3: 00000000, значение 0 = операция чтения, 1 = операция записи Arg4: 8a81bd11, адрес, на который ссылается память

Детали отладки:

READ_ADDRESS: GetPointerFromAddress: невозможно прочитать с 84788848 Невозможно прочитать память MiSystemVaType на 84767e20 00000000

CURRENT_IRQL: 2

FAULTING_IP: ndis! NdisOidRequestComplete + 8a 8a81bd11 803b05
cmp byte ptr [ebx],5

CUSTOMER_CRASH_COUNT: 1

DEFAULT_BUCKET_ID: VISTA_DRIVER_FAULT

BUGCHECK_STR: 0xD1

PROCESS_NAME: система

TRAP_FRAME: 8dd07aa0 - (.trap 0xffffffff8dd07aa0) ErrCode = 00000000 eax=00000200 ebx=00000000 ecx=00000001 edx=00000000 esi=8dd07b4c edi=a277f5a4 eip=8a81bd11 ps = eb = esb ep = esp 0 eb = esp 0 eb = esp eb = esp 0 eb = esp eb = esp 0 eb = esp = nc cs = 0008 сс = 0010 дс =0023 эс =0023 фс =0030 гс = 0000 эфл =00010246

! NDIS ndisOidRequestComplete + 0x8a:

8a81bd11 803b05 cmp байт ptr [ebx],5 дс:0023:00000000=??

Сброс области по умолчанию

LAST_CONTROL_TRANSFER: от 8a81bd11 до 846605fb

STACK_TEXT:

8dd07aa0 8a81bd11 badb0d00 00000000 8dd07ac0 nt! KiTrap0E + 0x2cf

8dd07b34 8a81c8b9 8dd07b4c 8c840008 870c1618 ndis! NdisOidRequestComplete + 0x8a

8dd07b68 952b411b 8963b0f0 a277f5a4 00000000 ndis! NdisFOidRequestComplete + 0x6a

8dd07b88 8a81c19d 870c1618 8c840008 00000000 стимулятор! PcFilterRequestComplete + 0x5b

8dd07bbc 8a843572 02d07bd4 00000000 89ac60e0 ndis! NdisOidRequestComplete + 0x516

8dd07bf4 8a843805 00ac60e0 8c840008 00000000 ndis!NdisMOidRequestCompleteInternal + 0xd0

8dd07c18 8a87a765 02ac60e0 00000000 8c840008 ndis! NdisCompleteLegacyRequest + 0xdb

8dd07c38 95a831c5 89ac60e0 00000000 89ad20e0 ndis!NdisMSetInformationComplete + 0x81

8dd07c54 8a87506f 8a1d48e8 8a1d4908 00000000 fxwrap!PtRequestComplete + 0x61

8dd07c70 8a81c05b 876f54c0 8966f0f0 00000000 ndis! NdisCompleteOidRequestToRequest + 0x4a

8dd07ca4 8a8704b2 00d07cbc 89ad20e0 8a85a000 ndis! NdisOidRequestComplete + 0x3d4

8dd07ce8 8a823221 00ad20e0 8966f190 86a58638 ndis! NdisMDoOidRequest + 0x528

8dd07d00 8469ca6b 8966f188 00000000 86a58638 ndis! NdisDoOidRequests + 0x4d

8dd07d50 84827fda 00000000 92ed9892 00000000 nt! ExpWorkerThread + 0x10d

8dd07d90 846d01f9 8469c95e 00000000 00000000 nt! PspSystemThreadStartup + 0x9e

00000000 00000000 00000000 00000000 00000000 nt! KiThreadStartup + 0x19

STACK_COMMAND: кб

FOLLOWUP_IP: Pacer!PcFilterRequestComplete+5b 952b411b 56
Push ESI

SYMBOL_STACK_INDEX: 3

SYMBOL_NAME: кардиостимулятор! PcFilterRequestComplete + 5b

FOLLOWUP_NAME: MachineOwner

MODULE_NAME: кардиостимулятор

IMAGE_NAME: pacer.sys

DEBUG_FLR_IMAGE_TIMESTAMP: 4a5bc916

FAILURE_BUCKET_ID: 0xD1_pacer! PcFilterRequestComplete + 5b

BUCKET_ID: 0xD1_pacer! PcFilterRequestComplete + 5b

Продолжение: MachineOwner

спасибо за любой вклад.

1 ответ

Вы пишете, что это происходит во время удаления. Это также удаление или отключение драйвера? Я предполагаю, что это отключение драйвера, не вижу никакой причины, почему это должно происходить только при удалении. Ошибка происходит в установленной вами процедуре завершения OID. Для анализа требуется больше информации, особенно мнение pAdapt а также MiniportHandle Структуры. Однако наиболее вероятной причиной является отсутствие синхронизации - например, в этом случае это может произойти, если ваш драйвер уже освободил pAdapt контекст и завершение были вызваны после этого (опять же, это всего лишь предположение, нужно больше данных, чтобы дать более определенный ответ).

Другие вопросы по тегам