Index: ddk/wdm.h =================================================================== --- include/ddk/wdm.h (revision 64688) +++ include/ddk/wdm.h (working copy) @@ -9590,6 +9590,38 @@ ******************************************************************************/ +#define FAST_FAIL_LEGACY_GS_VIOLATION 0 +#define FAST_FAIL_VTGUARD_CHECK_FAILURE 1 +#define FAST_FAIL_STACK_COOKIE_CHECK_FAILURE 2 +#define FAST_FAIL_CORRUPT_LIST_ENTRY 3 +#define FAST_FAIL_INCORRECT_STACK 4 +#define FAST_FAIL_INVALID_ARG 5 +#define FAST_FAIL_GS_COOKIE_INIT 6 +#define FAST_FAIL_FATAL_APP_EXIT 7 +#define FAST_FAIL_RANGE_CHECK_FAILURE 8 +#define FAST_FAIL_UNSAFE_REGISTRY_ACCESS 9 +#define FAST_FAIL_GUARD_ICALL_CHECK_FAILURE 10 +#define FAST_FAIL_GUARD_WRITE_CHECK_FAILURE 11 +#define FAST_FAIL_INVALID_FIBER_SWITCH 12 +#define FAST_FAIL_INVALID_SET_OF_CONTEXT 13 +#define FAST_FAIL_INVALID_REFERENCE_COUNT 14 +#define FAST_FAIL_INVALID_JUMP_BUFFER 18 +#define FAST_FAIL_MRDATA_MODIFIED 19 +#define FAST_FAIL_INVALID_FAST_FAIL_CODE 0xFFFFFFFF + +DECLSPEC_NORETURN +FORCEINLINE +VOID +RtlFailFast( + _In_ ULONG Code) +{ + __fastfail(Code); +} + +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && (defined(_M_CEE_PURE) || defined(_M_CEE_SAFE)) +#define NO_KERNEL_LIST_ENTRY_CHECKS +#endif + #if !defined(MIDL_PASS) && !defined(SORTPP_PASS) #define RTL_STATIC_LIST_HEAD(x) LIST_ENTRY x = { &x, &x } @@ -9613,6 +9645,46 @@ 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); + + RtlFailFast(FAST_FAIL_CORRUPT_LIST_ENTRY); +} + +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) { @@ -9621,6 +9693,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); @@ -9634,8 +9710,17 @@ PLIST_ENTRY Flink; PLIST_ENTRY Entry; +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG + RtlpCheckListEntry(ListHead); + if (ListHead->Flink == ListHead || ListHead->Blink == ListHead) + FatalListEntryError(ListHead->Blink, ListHead, ListHead->Flink); +#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; @@ -9649,8 +9734,17 @@ PLIST_ENTRY Blink; PLIST_ENTRY Entry; +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG + RtlpCheckListEntry(ListHead); + if (ListHead->Flink == ListHead || ListHead->Blink == ListHead) + FatalListEntryError(ListHead->Blink, ListHead, ListHead->Flink); +#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; @@ -9663,9 +9757,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; } @@ -9677,9 +9778,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; } @@ -9692,6 +9800,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 64688) +++ include/xdk/rtlfuncs.h (working copy) @@ -4,6 +4,38 @@ $if (_WDMDDK_) +#define FAST_FAIL_LEGACY_GS_VIOLATION 0 +#define FAST_FAIL_VTGUARD_CHECK_FAILURE 1 +#define FAST_FAIL_STACK_COOKIE_CHECK_FAILURE 2 +#define FAST_FAIL_CORRUPT_LIST_ENTRY 3 +#define FAST_FAIL_INCORRECT_STACK 4 +#define FAST_FAIL_INVALID_ARG 5 +#define FAST_FAIL_GS_COOKIE_INIT 6 +#define FAST_FAIL_FATAL_APP_EXIT 7 +#define FAST_FAIL_RANGE_CHECK_FAILURE 8 +#define FAST_FAIL_UNSAFE_REGISTRY_ACCESS 9 +#define FAST_FAIL_GUARD_ICALL_CHECK_FAILURE 10 +#define FAST_FAIL_GUARD_WRITE_CHECK_FAILURE 11 +#define FAST_FAIL_INVALID_FIBER_SWITCH 12 +#define FAST_FAIL_INVALID_SET_OF_CONTEXT 13 +#define FAST_FAIL_INVALID_REFERENCE_COUNT 14 +#define FAST_FAIL_INVALID_JUMP_BUFFER 18 +#define FAST_FAIL_MRDATA_MODIFIED 19 +#define FAST_FAIL_INVALID_FAST_FAIL_CODE 0xFFFFFFFF + +DECLSPEC_NORETURN +FORCEINLINE +VOID +RtlFailFast( + _In_ ULONG Code) +{ + __fastfail(Code); +} + +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && (defined(_M_CEE_PURE) || defined(_M_CEE_SAFE)) +#define NO_KERNEL_LIST_ENTRY_CHECKS +#endif + #if !defined(MIDL_PASS) && !defined(SORTPP_PASS) #define RTL_STATIC_LIST_HEAD(x) LIST_ENTRY x = { &x, &x } @@ -27,6 +59,46 @@ 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); + + RtlFailFast(FAST_FAIL_CORRUPT_LIST_ENTRY); +} + +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 +107,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 +124,17 @@ PLIST_ENTRY Flink; PLIST_ENTRY Entry; +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG + RtlpCheckListEntry(ListHead); + if (ListHead->Flink == ListHead || ListHead->Blink == ListHead) + FatalListEntryError(ListHead->Blink, ListHead, ListHead->Flink); +#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 +148,17 @@ PLIST_ENTRY Blink; PLIST_ENTRY Entry; +#if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG + RtlpCheckListEntry(ListHead); + if (ListHead->Flink == ListHead || ListHead->Blink == ListHead) + FatalListEntryError(ListHead->Blink, ListHead, ListHead->Flink); +#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 +171,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 +192,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 +214,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;