Странная ошибка, или просто я гоню...

Тема в разделе "WASM.NT.KERNEL", создана пользователем Ox8BFF55, 18 янв 2010.

  1. Ox8BFF55

    Ox8BFF55 New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2009
    Сообщения:
    181
    Пишу NDIS драйвер, но выскакивает знакомый экран....

    Код (Text):
    1.     pAdapter->GoodReceives++;
    2.  
    3.     // Store the RCB pointer
    4.     //*(PRCB *)(pRCB->Packet->MiniportReserved) = pRCB;
    5.  
    6.     //
    7.     // Indicate the packet to NDIS
    8.     //
    9.     NdisMIndicateReceivePacket(
    10.         pAdapter->AdapterHandle,
    11.         &pPacket,
    12.         1 );
    SendRecvRequest(pAdapter, pRCB);

    Ошибка происходит в выделенном месте, при чем при передачи параметров в функцию...

    Код (Text):
    1. [b]
    2. ba39bfb9 6a01             push    1
    3. ba39bfbb 8d45ec          lea       eax,[ebp-14h]
    4. ba39bfbe 50                push     eax
    5. ba39bfbf 8b4df0           mov      ecx,dword ptr [ebp-10h]
    6. ba39bfc2 8b5120          mov      edx,dword ptr [ecx+20h]
    7. ba39bfc5 52                push     edx
    8. ba39bfc6 8b45f0          mov      eax,dword ptr [ebp-10h]
    9. ba39bfc9 8b4820          mov     ecx,dword ptr [eax+20h]
    10. ba39bfcc 8b91e8000000 mov    edx,dword ptr [ecx+0E8h]
    11. ba39bfd2 ffd2               call     edx
    12. [b]ba39bfd4 8b45f4           mov    eax,dword ptr [ebp-0Ch][/b]
    13. ba39bfd7 50                 push   eax
    14. ba39bfd8 8b4df0           mov    ecx,dword ptr [ebp-10h]
    15. ba39bfdb 51                 push   ecx
    16. ba39bfdc e8dffcffff        call    TestNdis!SendRecvRequest (ba39bcc0)
    (Ошибка происходит в выделенном месте)

    В первый на операции mov происходит падение, но нестабильное, то и есть на каком то вызове функции.
     
  2. Ox8BFF55

    Ox8BFF55 New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2009
    Сообщения:
    181
    П.С. Происходит CompleteRoutine

    П.С. П.С. CompleteRoutine постоянно вызывает IoCallDriver, и на одном из таких вызавов происходит странное падение....
     
  3. Ox8BFF55

    Ox8BFF55 New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2009
    Сообщения:
    181
    Вообщем сама функция
    Код (Text):
    1. NTSTATUS
    2. NIC_OnReceiveIrpComplete(
    3.     IN PDEVICE_OBJECT pDeviceObject,
    4.     IN PIRP pIrp,
    5.     IN PVOID Context
    6.     )
    7. {
    8.     char buffer[1024];
    9.     PRCB    pRCB = (PRCB) Context;
    10.     PNDIS_PACKET    pPacket = pRCB->Packet;
    11.     PMP_ADAPTER pAdapter = pRCB->Adapter;
    12.     ULONG           Length;
    13.  
    14.     NDIS_STATUS     Status;
    15.     NTSTATUS        NtStatus;
    16.  
    17.     if( pIrp->IoStatus.Status == STATUS_SUCCESS ) {
    18.         LARGE_INTEGER  Time;
    19.  
    20.         Length = (ULONG)pIrp->IoStatus.Information;
    21.  
    22.         NDIS_SET_PACKET_HEADER_SIZE( pPacket, ETH_HEADER_SIZE );
    23.  
    24.         DEBUGP(MP_TRACE, ("Adapter %p, RCB %p, len: %u\n", pAdapter, pRCB, Length));
    25.        
    26.         if( Length < ETH_MIN_PACKET_SIZE ) {
    27.             DEBUGP(MP_TRACE, ("Length < ETH_MIN_PACKET_SIZE (%u < %u)\n", Length, ETH_MIN_PACKET_SIZE));
    28.  
    29.             NdisZeroMemory(
    30.                 &pRCB->Data[ Length ],
    31.                 ETH_MIN_PACKET_SIZE - Length
    32.                 );
    33.  
    34.             Length = ETH_MIN_PACKET_SIZE;
    35.         }
    36.  
    37.         NdisAdjustBufferLength(
    38.             pRCB->Buffer,
    39.             Length
    40.             );
    41.        
    42.         NdisGetCurrentSystemTime( &Time );
    43.  
    44.         NDIS_SET_PACKET_TIME_RECEIVED(
    45.             pPacket,
    46.             Time.QuadPart
    47.             );
    48.  
    49.         NDIS_SET_PACKET_STATUS(
    50.             pPacket,
    51.             NDIS_STATUS_SUCCESS
    52.             );
    53.  
    54.         pAdapter->GoodReceives++;
    55.  
    56.         //
    57.         // Indicate the packet to NDIS
    58.         //
    59.         NdisMIndicateReceivePacket(
    60.             pAdapter->AdapterHandle,
    61.             &pPacket,
    62.             1 );
    63.  
    64.        
    65.         DEBUGP(MP_TRACE, ("Start call SendRecvRequest\n"));
    SendRecvRequest(pAdapter, pRCB);
    Код (Text):
    1.     }
    2.     else
    3.     {
    4.         DEBUGP(MP_TRACE, ("Adapter %p, Irp status (0x%X)! - Free the RCB %p...\n",
    5.             pAdapter, pIrp->IoStatus.Status, pRCB
    6.             ));
    7.         pAdapter->RcvCrcErrors++;
    8.  
    9.         NICFreeRcbPacket( pAdapter, pRCB );
    10.         return STATUS_MORE_PROCESSING_REQUIRED;
    11.     }
    12.  
    13.     return STATUS_MORE_PROCESSING_REQUIRED;
    14. }
    Падения я выделил
     
  4. Ox8BFF55

    Ox8BFF55 New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2009
    Сообщения:
    181
    Что то очень странное, так как любая инструкция после
    Код (Text):
    1. NdisMIndicateReceivePacket
    делает BSOD, но проявляется не сразу...