стимуляторы вызывают BSOD - PullRequest
       32

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

0 голосов
/ 09 февраля 2012

Я создал драйвер промежуточного фильтра 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 + 8 8a81bd11 803b05 * 1 021 * CMP байты PTR [EBX], 5

CUSTOMER_CRASH_COUNT: 1

DEFAULT_BUCKET_ID: VISTA_DRIVER_FAULT

BUGCHECK_STR: 0xD1

PROCESS_NAME: System * 1030_Faa: ИМЯ: 1030_Fa: 1031: 1031: 1031: 1031: 1031: 103100010 ds = 0023 es = 0023 fs = 0030 gs = 0000 efl = 00010246

ndis! NdisOidRequestComplete + 0x8a:

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

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

LAST_CONTROL_TRANSFER: от 8a81bd11 до 846605fb

STACK_TEXT:

8dd07aa0 8a81bd11 badb0d00 00000000 8dd07ac0 нт! KiTrap0E + 0x2cf

1047 * 8dd07b34 8a81c8b9 8dd07b4c 8c840008 870c1618 NDIS! ndisOidRequestComplete + 0x8a
1049 * 8dd07b68 952b411b 8963b0f0 a277f5a4 00000000 NDIS! NdisFOidRequestComplete + 0x6a
1051 *8dd07b88 8a81c19d 870c1618 8c840008 00000000 иноходца! PcFilterRequestComplete + 0x5b
1053 * 8dd07bbc 8a843572 02d07bd4 00000000 89ac60e0 NDIS! ndisOidRequestComplete + 0x516

8dd07bf4 8a843805 00ac60e0 8c840008 00000000 NDIS! ndisMOidRequestCompleteInternal + 0xd0

1057 * 8dd07c18 8a87a76502ac60e0 00000000 8c840008 NDIS ndisCompleteLegacyRequest! + 0xdb
1059 * 8dd07c38 95a831c5 89ac60e0 00000000 89ad20e0 NDIS! NdisMSetInformationComplete + 0x81
1061 * 8dd07c54 8a87506f 8a1d48e8 8a1d4908 00000000 fxwrap! PtRequestComplete + 0x61
1063 * 8dd07c70 8a81c05б 876f54c0 8966f0f0 00000000 NDIS! NdisCompleteOidRequestToRequest + 0x4a

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

1067 * 8dd07ce8 8a823221 00ad20e0 8966f190 86a58638 NDIS! NdisMDoOidRequest + 0x528
1069 * 8dd07d00 8469ca6b 8966f18800000000 86a58638 ndis! NdisDoOidRequests + 0x4d

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

8dd07d90 846d01f9 8469000000000000000000000000000000000000000000000000nt! KiThreadStartup + 0x19

STACK_COMMAND: кб

FOLLOWUP_IP: кардиостимулятор! PcFilterRequestComplete + 5b 952b411b 56
push esi

SYMBOL_STACK_83_83D:: pacer! PcFilterRequestComplete + 5b

FOLLOWUP_NAME: MachineOwner

MODULE_NAME: pacer

IMAGE_NAME: pacer.sys

DEBUG_FLR_IMAGE_TIMESTAMP: 4a5bc916

1094 * FAILURE_BUCKET_ID: 0xD1_pacer PcFilterRequestComplete + 5b
1096 * BUCKET_ID: 0xD1_pacer PcFilterRequestComplete + 5b
1098 * Followup: MachineOwner
1100

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

1 Ответ

0 голосов
/ 21 октября 2012

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

...