This is needed for poolmon/querying pool tags.
svn path=/trunk/; revision=55865
IN PKEXCEPTION_FRAME ExceptionFrame
);
+//
+// Generic DPC Routines
+//
+VOID
+NTAPI
+KeGenericCallDpc(
+ IN PKDEFERRED_ROUTINE Routine,
+ IN PVOID Context
+);
+
+VOID
+NTAPI
+KeSignalCallDpcDone(
+ IN PVOID SystemArgument1
+);
+
+BOOLEAN
+NTAPI
+KeSignalCallDpcSynchronize(
+ IN PVOID SystemArgument2
+);
+
//
// ARC Configuration Functions. Only enabled if you have ARC Support
//
PKINTERRUPT_ROUTINE *FlatDispatch;
} DISPATCH_INFO, *PDISPATCH_INFO;
+typedef struct _DEFERRED_REVERSE_BARRIER
+{
+ ULONG Barrier;
+ ULONG TotalProcessors;
+} DEFERRED_REVERSE_BARRIER, *PDEFERRED_REVERSE_BARRIER;
+
typedef struct _KI_SAMPLE_MAP
{
LARGE_INTEGER PerfStart;
Dpc->Number = Number + MAXIMUM_PROCESSORS;
}
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+KeGenericCallDpc(IN PKDEFERRED_ROUTINE Routine,
+ IN PVOID Context)
+{
+ ULONG Barrier = KeNumberProcessors;
+ KIRQL OldIrql;
+ DEFERRED_REVERSE_BARRIER ReverseBarrier;
+ ASSERT(KeGetCurrentIrql () < DISPATCH_LEVEL);
+
+ //
+ // The barrier is the number of processors, each processor will decrement it
+ // by one, so when all processors have run the DPC, the barrier reaches zero
+ //
+ ReverseBarrier.Barrier = Barrier;
+ ReverseBarrier.TotalProcessors = Barrier;
+
+ //
+ // But we don't need the barrier on UP, since we can simply call the routine
+ // directly while at DISPATCH_LEVEL and not worry about anything else
+ //
+ KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
+ Routine(&KeGetCurrentPrcb()->CallDpc, Context, &Barrier, &ReverseBarrier);
+ KeLowerIrql(OldIrql);
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+KeSignalCallDpcDone(IN PVOID SystemArgument1)
+{
+ //
+ // Decrement the barrier, which is actually the processor count
+ //
+ InterlockedDecrement((PLONG)SystemArgument1);
+}
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+KeSignalCallDpcSynchronize(IN PVOID SystemArgument2)
+{
+ //
+ // There is nothing to do on UP systems -- the processor calling this wins
+ //
+ UNREFERENCED_PARAMETER(SystemArgument2);
+ return TRUE;
+}
+
/* EOF */
@ stdcall KeFindConfigurationNextEntry(ptr long long ptr ptr)
@ stdcall KeFlushEntireTb(long long)
@ stdcall KeFlushQueuedDpcs()
-;KeGenericCallDpc
+@ stdcall KeGenericCallDpc(ptr ptr)
@ stdcall KeGetCurrentThread()
@ stdcall KeGetPreviousMode()
@ stdcall KeGetRecommendedSharedDataAlignment()
@ stdcall KeSetTimeIncrement(long long)
@ stdcall KeSetTimer(ptr long long ptr)
@ stdcall KeSetTimerEx(ptr long long long ptr)
-;KeSignalCallDpcDone
-;KeSignalCallDpcSynchronize
+@ stdcall KeSignalCallDpcDone(ptr)
+@ stdcall KeSignalCallDpcSynchronize(ptr)
@ stdcall KeStackAttachProcess(ptr ptr)
@ stdcall KeSynchronizeExecution(ptr ptr ptr)
@ stdcall KeTerminateThread(long)