PVOID FASTCALL WmipReserveTraceBuffer( IN PWMI_LOGGER_CONTEXT LoggerContext, IN ULONG RequiredSize, OUT PWMI_BUFFER_HEADER *BufferResource, OUT PLARGE_INTEGER TimeStamp ); Routine Description: This function is the main logging function that reserves spaces for any events. The algorithm is as follows: Every time a space is needed, we InterlockedExchangeAdd CurrentOffset. A local variable Offset is used to track the initial value when InterlockedExchangeAdd is taken. If there is enough space for this event (i.e., (Offset + RequiredSize) <= BufferSize), then we have successfully reserved the space. If there is not enough space left on this buffer, we will call WmipSwitchBuffer for a new buffer. In this case, CurrentOffset should be larger than the buffersize. Since other thread can still be trying to reserve space using thie buffer, we saved the offset on SavedOffset the the logger thread knows the real offset to be written to disk. Note that, since the CurrentOffset if growing monotonically, only one thread is advancing the CurrentOffset from below BufferSize to beyond BufferSize. It is this thread's responsibility to set the SavedOffset properly. Arguments: LoggerContext - Logger context from current logging session. RequiredSize - The space needed for logging the data. Buffer - Pointer to a buffer header TimeStamp - TimeStamp of the event Return Value: The status of running the buffer manager Environment: Kernel mode. This routine should work at any IRQL.