Index: ddk/wdm.h =================================================================== --- include/ddk/wdm.h (revision 63811) +++ include/ddk/wdm.h (working copy) @@ -9658,6 +9658,49 @@ FORCEINLINE BOOLEAN +RemoveEntryListUnsafe( + _In_ PLIST_ENTRY Entry) +{ + PLIST_ENTRY OldFlink; + PLIST_ENTRY OldBlink; + + OldFlink = Entry->Flink; + OldBlink = Entry->Blink; + OldFlink->Blink = OldBlink; + OldBlink->Flink = OldFlink; + return (BOOLEAN)(OldFlink == OldBlink); +} + +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) +FORCEINLINE +VOID +FatalListEntryError( + _In_ PVOID P1, + _In_ PVOID P2, + _In_ PVOID P3) +{ + UNREFERENCED_PARAMETER(P1); + UNREFERENCED_PARAMETER(P2); + UNREFERENCED_PARAMETER(P3); + + /* Not bothering with fastfail instrinsic, + * entering the debugger is good enough for now */ + /* RtlFailFast(FAST_FAIL_CORRUPT_LIST_ENTRY); */ + __debugbreak(); +} + +FORCEINLINE +VOID +RtlpCheckListEntry( + _In_ PLIST_ENTRY Entry) +{ + if (Entry->Flink->Blink != Entry || Entry->Blink->Flink != Entry) + FatalListEntryError(Entry->Blink, Entry, Entry->Flink); +} +#endif + +FORCEINLINE +BOOLEAN RemoveEntryList( _In_ PLIST_ENTRY Entry) { @@ -9666,6 +9709,10 @@ OldFlink = Entry->Flink; OldBlink = Entry->Blink; +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) + if (OldFlink->Blink != Entry || OldBlink->Flink != Entry) + FatalListEntryError(OldBlink, Entry, OldFlink); +#endif OldFlink->Blink = OldBlink; OldBlink->Flink = OldFlink; return (BOOLEAN)(OldFlink == OldBlink); @@ -9679,8 +9726,15 @@ PLIST_ENTRY Flink; PLIST_ENTRY Entry; +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG + RtlpCheckListEntry(ListHead); +#endif Entry = ListHead->Flink; Flink = Entry->Flink; +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) + if (Entry->Blink != ListHead || Flink->Blink != Entry) + FatalListEntryError(ListHead, Entry, Flink); +#endif ListHead->Flink = Flink; Flink->Blink = ListHead; return Entry; @@ -9694,8 +9748,15 @@ PLIST_ENTRY Blink; PLIST_ENTRY Entry; +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG + RtlpCheckListEntry(ListHead); +#endif Entry = ListHead->Blink; Blink = Entry->Blink; +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) + if (Blink->Flink != Entry || Entry->Flink != ListHead) + FatalListEntryError(Blink, Entry, ListHead); +#endif ListHead->Blink = Blink; Blink->Flink = ListHead; return Entry; @@ -9708,9 +9769,16 @@ _Inout_ __drv_aliasesMem PLIST_ENTRY Entry) { PLIST_ENTRY OldBlink; +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG + RtlpCheckListEntry(ListHead); +#endif OldBlink = ListHead->Blink; Entry->Flink = ListHead; Entry->Blink = OldBlink; +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) + if (OldBlink->Flink != ListHead) + FatalListEntryError(OldBlink->Blink, OldBlink, ListHead); +#endif OldBlink->Flink = Entry; ListHead->Blink = Entry; } @@ -9722,9 +9790,16 @@ _Inout_ __drv_aliasesMem PLIST_ENTRY Entry) { PLIST_ENTRY OldFlink; +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG + RtlpCheckListEntry(ListHead); +#endif OldFlink = ListHead->Flink; Entry->Flink = OldFlink; Entry->Blink = ListHead; +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) + if (OldFlink->Blink != ListHead) + FatalListEntryError(ListHead, OldFlink, OldFlink->Flink); +#endif OldFlink->Blink = Entry; ListHead->Flink = Entry; } @@ -9737,6 +9812,10 @@ { PLIST_ENTRY ListEnd = ListHead->Blink; +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG + RtlpCheckListEntry(ListHead); + RtlpCheckListEntry(ListToAppend); +#endif ListHead->Blink->Flink = ListToAppend; ListHead->Blink = ListToAppend->Blink; ListToAppend->Blink->Flink = ListHead; Index: xdk/rtlfuncs.h =================================================================== --- include/xdk/rtlfuncs.h (revision 63811) +++ include/xdk/rtlfuncs.h (working copy) @@ -27,6 +27,49 @@ FORCEINLINE BOOLEAN +RemoveEntryListUnsafe( + _In_ PLIST_ENTRY Entry) +{ + PLIST_ENTRY OldFlink; + PLIST_ENTRY OldBlink; + + OldFlink = Entry->Flink; + OldBlink = Entry->Blink; + OldFlink->Blink = OldBlink; + OldBlink->Flink = OldFlink; + return (BOOLEAN)(OldFlink == OldBlink); +} + +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) +FORCEINLINE +VOID +FatalListEntryError( + _In_ PVOID P1, + _In_ PVOID P2, + _In_ PVOID P3) +{ + UNREFERENCED_PARAMETER(P1); + UNREFERENCED_PARAMETER(P2); + UNREFERENCED_PARAMETER(P3); + + /* Not bothering with fastfail instrinsic, + * entering the debugger is good enough for now */ + /* RtlFailFast(FAST_FAIL_CORRUPT_LIST_ENTRY); */ + __debugbreak(); +} + +FORCEINLINE +VOID +RtlpCheckListEntry( + _In_ PLIST_ENTRY Entry) +{ + if (Entry->Flink->Blink != Entry || Entry->Blink->Flink != Entry) + FatalListEntryError(Entry->Blink, Entry, Entry->Flink); +} +#endif + +FORCEINLINE +BOOLEAN RemoveEntryList( _In_ PLIST_ENTRY Entry) { @@ -35,6 +78,10 @@ OldFlink = Entry->Flink; OldBlink = Entry->Blink; +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) + if (OldFlink->Blink != Entry || OldBlink->Flink != Entry) + FatalListEntryError(OldBlink, Entry, OldFlink); +#endif OldFlink->Blink = OldBlink; OldBlink->Flink = OldFlink; return (BOOLEAN)(OldFlink == OldBlink); @@ -48,8 +95,15 @@ PLIST_ENTRY Flink; PLIST_ENTRY Entry; +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG + RtlpCheckListEntry(ListHead); +#endif Entry = ListHead->Flink; Flink = Entry->Flink; +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) + if (Entry->Blink != ListHead || Flink->Blink != Entry) + FatalListEntryError(ListHead, Entry, Flink); +#endif ListHead->Flink = Flink; Flink->Blink = ListHead; return Entry; @@ -63,8 +117,15 @@ PLIST_ENTRY Blink; PLIST_ENTRY Entry; +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG + RtlpCheckListEntry(ListHead); +#endif Entry = ListHead->Blink; Blink = Entry->Blink; +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) + if (Blink->Flink != Entry || Entry->Flink != ListHead) + FatalListEntryError(Blink, Entry, ListHead); +#endif ListHead->Blink = Blink; Blink->Flink = ListHead; return Entry; @@ -77,9 +138,16 @@ _Inout_ __drv_aliasesMem PLIST_ENTRY Entry) { PLIST_ENTRY OldBlink; +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG + RtlpCheckListEntry(ListHead); +#endif OldBlink = ListHead->Blink; Entry->Flink = ListHead; Entry->Blink = OldBlink; +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) + if (OldBlink->Flink != ListHead) + FatalListEntryError(OldBlink->Blink, OldBlink, ListHead); +#endif OldBlink->Flink = Entry; ListHead->Blink = Entry; } @@ -91,9 +159,16 @@ _Inout_ __drv_aliasesMem PLIST_ENTRY Entry) { PLIST_ENTRY OldFlink; +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG + RtlpCheckListEntry(ListHead); +#endif OldFlink = ListHead->Flink; Entry->Flink = OldFlink; Entry->Blink = ListHead; +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) + if (OldFlink->Blink != ListHead) + FatalListEntryError(ListHead, OldFlink, OldFlink->Flink); +#endif OldFlink->Blink = Entry; ListHead->Flink = Entry; } @@ -106,6 +181,10 @@ { PLIST_ENTRY ListEnd = ListHead->Blink; +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG + RtlpCheckListEntry(ListHead); + RtlpCheckListEntry(ListToAppend); +#endif ListHead->Blink->Flink = ListToAppend; ListHead->Blink = ListToAppend->Blink; ListToAppend->Blink->Flink = ListHead;