Пишу NDIS драйвер, но выскакивает знакомый экран.... Код (Text): pAdapter->GoodReceives++; // Store the RCB pointer //*(PRCB *)(pRCB->Packet->MiniportReserved) = pRCB; // // Indicate the packet to NDIS // NdisMIndicateReceivePacket( pAdapter->AdapterHandle, &pPacket, 1 ); SendRecvRequest(pAdapter, pRCB); Ошибка происходит в выделенном месте, при чем при передачи параметров в функцию... Код (Text): [b] ba39bfb9 6a01 push 1 ba39bfbb 8d45ec lea eax,[ebp-14h] ba39bfbe 50 push eax ba39bfbf 8b4df0 mov ecx,dword ptr [ebp-10h] ba39bfc2 8b5120 mov edx,dword ptr [ecx+20h] ba39bfc5 52 push edx ba39bfc6 8b45f0 mov eax,dword ptr [ebp-10h] ba39bfc9 8b4820 mov ecx,dword ptr [eax+20h] ba39bfcc 8b91e8000000 mov edx,dword ptr [ecx+0E8h] ba39bfd2 ffd2 call edx [b]ba39bfd4 8b45f4 mov eax,dword ptr [ebp-0Ch][/b] ba39bfd7 50 push eax ba39bfd8 8b4df0 mov ecx,dword ptr [ebp-10h] ba39bfdb 51 push ecx ba39bfdc e8dffcffff call TestNdis!SendRecvRequest (ba39bcc0) (Ошибка происходит в выделенном месте) В первый на операции mov происходит падение, но нестабильное, то и есть на каком то вызове функции.
П.С. Происходит CompleteRoutine П.С. П.С. CompleteRoutine постоянно вызывает IoCallDriver, и на одном из таких вызавов происходит странное падение....
Вообщем сама функция Код (Text): NTSTATUS NIC_OnReceiveIrpComplete( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp, IN PVOID Context ) { char buffer[1024]; PRCB pRCB = (PRCB) Context; PNDIS_PACKET pPacket = pRCB->Packet; PMP_ADAPTER pAdapter = pRCB->Adapter; ULONG Length; NDIS_STATUS Status; NTSTATUS NtStatus; if( pIrp->IoStatus.Status == STATUS_SUCCESS ) { LARGE_INTEGER Time; Length = (ULONG)pIrp->IoStatus.Information; NDIS_SET_PACKET_HEADER_SIZE( pPacket, ETH_HEADER_SIZE ); DEBUGP(MP_TRACE, ("Adapter %p, RCB %p, len: %u\n", pAdapter, pRCB, Length)); if( Length < ETH_MIN_PACKET_SIZE ) { DEBUGP(MP_TRACE, ("Length < ETH_MIN_PACKET_SIZE (%u < %u)\n", Length, ETH_MIN_PACKET_SIZE)); NdisZeroMemory( &pRCB->Data[ Length ], ETH_MIN_PACKET_SIZE - Length ); Length = ETH_MIN_PACKET_SIZE; } NdisAdjustBufferLength( pRCB->Buffer, Length ); NdisGetCurrentSystemTime( &Time ); NDIS_SET_PACKET_TIME_RECEIVED( pPacket, Time.QuadPart ); NDIS_SET_PACKET_STATUS( pPacket, NDIS_STATUS_SUCCESS ); pAdapter->GoodReceives++; // // Indicate the packet to NDIS // NdisMIndicateReceivePacket( pAdapter->AdapterHandle, &pPacket, 1 ); DEBUGP(MP_TRACE, ("Start call SendRecvRequest\n")); SendRecvRequest(pAdapter, pRCB); Код (Text): } else { DEBUGP(MP_TRACE, ("Adapter %p, Irp status (0x%X)! - Free the RCB %p...\n", pAdapter, pIrp->IoStatus.Status, pRCB )); pAdapter->RcvCrcErrors++; NICFreeRcbPacket( pAdapter, pRCB ); return STATUS_MORE_PROCESSING_REQUIRED; } return STATUS_MORE_PROCESSING_REQUIRED; } Падения я выделил
Что то очень странное, так как любая инструкция после Код (Text): NdisMIndicateReceivePacket делает BSOD, но проявляется не сразу...