@@ -562,45 +562,44 @@ _Use_decl_annotations_
562562VOID
563563NPF_RegisterBpf (
564564 PNPCAP_FILTER_MODULE pFiltMod ,
565- PNPCAP_BPF_PROGRAM pBpfProgram ,
566- PNPCAP_BPF_PROGRAM pOldBpfProgram )
565+ PNPCAP_BPF_PROGRAM pBpfProgram )
567566{
568567 // Assert/verify pBpfProgram fields are set
569568 LOCK_STATE_EX lockState ;
570569
571570 NT_ASSERT (pBpfProgram -> pOpen != NULL );
572- NT_ASSERT (pBpfProgram -> BpfProgramsEntry .Flink == NULL
573- && pBpfProgram -> BpfProgramsEntry .Blink == NULL );
571+ NT_ASSERT (pBpfProgram -> pOpen -> pFiltMod == pFiltMod );
574572
575- // Lock the BpfPrograms list
576- NdisAcquireRWLockWrite (pFiltMod -> BpfProgramsLock , & lockState , 0 );
577- // Insert/update the bpf for this open instance
578- if (pOldBpfProgram != NULL )
579- {
580- // This Open has a program in the list already.
581- NT_ASSERT (pOldBpfProgram != pBpfProgram );
582- NT_ASSERT (pBpfProgram -> pOpen == pOldBpfProgram -> pOpen );
583- PLIST_ENTRY pOldEntry = & pOldBpfProgram -> BpfProgramsEntry ;
584- PLIST_ENTRY pNewEntry = & pBpfProgram -> BpfProgramsEntry ;
585-
586- // Link the new program to the rest of the list
587- pNewEntry -> Flink = pOldEntry -> Flink ;
588- pNewEntry -> Blink = pOldEntry -> Blink ;
589- // Link the next and previous entries to the new program
590- pOldEntry -> Flink -> Blink = pNewEntry ;
591- pOldEntry -> Blink -> Flink = pNewEntry ;
592- // Make the old program invalid
593- // Freeing the program is the caller's responsibility.
594- pOldEntry -> Flink = NULL ;
595- pOldEntry -> Blink = NULL ;
596- }
597- else
573+ PLIST_ENTRY pNewEntry = & pBpfProgram -> BpfProgramsEntry ;
574+ // If the program is already in the list, nothing more to do
575+ if (pNewEntry -> Flink != NULL && NT_VERIFY (pNewEntry -> Blink != NULL ))
598576 {
599- InsertTailList (& pFiltMod -> BpfPrograms , & pBpfProgram -> BpfProgramsEntry );
577+ // In debug mode we can take the time to verify
578+ #if defined(_DBG )
579+ for (PLIST_ENTRY Curr = pFiltMod -> BpfPrograms .Flink ;
580+ Curr != & pFiltMod -> BpfPrograms ;
581+ Curr = Curr -> Flink )
582+ {
583+ if (Curr == pNewEntry )
584+ {
585+ return ;
586+ }
587+ }
588+ NT_ASSERT (FALSE);
589+ #endif
590+ return ;
600591 }
592+
593+ NT_ASSERT (pNewEntry -> Flink == NULL && pNewEntry -> Blink == NULL );
594+
595+ // Lock the BpfPrograms list
596+ NdisAcquireRWLockWrite (pFiltMod -> BpfProgramsLock , & lockState , 0 );
597+ // Insert the bpf for this open instance
598+ InsertTailList (& pFiltMod -> BpfPrograms , pNewEntry );
601599 // Unlock the list
602600 NdisReleaseRWLock (pFiltMod -> BpfProgramsLock , & lockState );
603601}
602+
604603_Use_decl_annotations_
605604VOID
606605NPF_UnregisterBpf (
@@ -617,6 +616,21 @@ NPF_UnregisterBpf(
617616 NT_ASSERT (pBpfProgram -> BpfProgramsEntry .Blink != NULL );
618617 // Lock the BpfPrograms list
619618 NdisAcquireRWLockWrite (pFiltMod -> BpfProgramsLock , & lockState , 0 );
619+ // In debug mode we can take the time to verify
620+ #if defined(_DBG )
621+ BOOLEAN bFound = FALSE;
622+ for (PLIST_ENTRY Curr = pFiltMod -> BpfPrograms .Flink ;
623+ Curr != & pFiltMod -> BpfPrograms ;
624+ Curr = Curr -> Flink )
625+ {
626+ if (Curr == & pBpfProgram -> BpfProgramsEntry )
627+ {
628+ bFound = TRUE;
629+ break ;
630+ }
631+ }
632+ NT_ASSERT (bFound );
633+ #endif
620634 // remove the bpf for this open instance
621635 RemoveEntryList (& pBpfProgram -> BpfProgramsEntry );
622636 // Unlock the list
@@ -700,7 +714,7 @@ NPF_StartUsingOpenInstance(
700714 NPF_UpdateTimestampModeCounts (pOpen -> pFiltMod , pOpen -> TimestampMode , TIMESTAMPMODE_UNSET );
701715
702716 // Insert a null filter (accept all)
703- NPF_RegisterBpf (pOpen -> pFiltMod , pOpen -> BpfProgram , NULL );
717+ NPF_RegisterBpf (pOpen -> pFiltMod , pOpen -> BpfProgram );
704718 pOpen -> OpenStatus = OpenRunning ;
705719 }
706720 else
@@ -2265,7 +2279,7 @@ NPF_AttachAdapter(
22652279 if (pOpen -> ReattachStatus < OpenAttached )
22662280 {
22672281 NPF_UpdateTimestampModeCounts (pFiltMod , pOpen -> TimestampMode , TIMESTAMPMODE_UNSET );
2268- NPF_RegisterBpf (pOpen -> pFiltMod , pOpen -> BpfProgram , NULL );
2282+ NPF_RegisterBpf (pOpen -> pFiltMod , pOpen -> BpfProgram );
22692283 }
22702284 pOpen -> OpenStatus = pOpen -> ReattachStatus ;
22712285 Curr = PopEntryList (& ReattachOpens );
0 commit comments