Reactos
1/*
2 * PROJECT: ReactOS Run-Time Library
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * PURPOSE: Rtl Trace Routines
5 */
6
7/* INCLUDES *******************************************************************/
8
9#include <rtl.h>
10#define NDEBUG
11#include <debug.h>
12
13static RTL_UNLOAD_EVENT_TRACE RtlpUnloadEventTrace[RTL_UNLOAD_EVENT_TRACE_NUMBER];
14static UINT RtlpUnloadEventTraceIndex = 0;
15
16/* FUNCTIONS ******************************************************************/
17
18PRTL_UNLOAD_EVENT_TRACE
19NTAPI
20RtlGetUnloadEventTrace(VOID)
21{
22 /* Just return a pointer to an array, according to MSDN */
23 return RtlpUnloadEventTrace;
24}
25
26VOID
27NTAPI
28LdrpRecordUnloadEvent(_In_ PLDR_DATA_TABLE_ENTRY LdrEntry)
29{
30 PIMAGE_NT_HEADERS NtHeaders;
31 UINT Sequence = RtlpUnloadEventTraceIndex++;
32 UINT Index = Sequence % RTL_UNLOAD_EVENT_TRACE_NUMBER;
33 USHORT StringLen;
34
35 DPRINT("LdrpRecordUnloadEvent(%wZ, %p - %p)\n", &LdrEntry->BaseDllName, LdrEntry->DllBase,
36 (ULONG_PTR)LdrEntry->DllBase + LdrEntry->SizeOfImage);
37
38 RtlpUnloadEventTrace[Index].BaseAddress = LdrEntry->DllBase;
39 RtlpUnloadEventTrace[Index].SizeOfImage = LdrEntry->SizeOfImage;
40 RtlpUnloadEventTrace[Index].Sequence = Sequence;
41
42 NtHeaders = RtlImageNtHeader(LdrEntry->DllBase);
43
44 if (NtHeaders)
45 {
46 RtlpUnloadEventTrace[Index].TimeDateStamp = NtHeaders->FileHeader.TimeDateStamp;
47 RtlpUnloadEventTrace[Index].CheckSum = NtHeaders->OptionalHeader.CheckSum;
48 }
49 else
50 {
51 RtlpUnloadEventTrace[Index].TimeDateStamp = 0;
52 RtlpUnloadEventTrace[Index].CheckSum = 0;
53 }
54
55 StringLen = min(LdrEntry->BaseDllName.Length / sizeof(WCHAR), RTL_NUMBER_OF(RtlpUnloadEventTrace[Index].ImageName));
56 RtlCopyMemory(RtlpUnloadEventTrace[Index].ImageName, LdrEntry->BaseDllName.Buffer, StringLen * sizeof(WCHAR));
57 if (StringLen < RTL_NUMBER_OF(RtlpUnloadEventTrace[Index].ImageName))
58 RtlpUnloadEventTrace[Index].ImageName[StringLen] = 0;
59}
60
61BOOLEAN
62NTAPI
63RtlTraceDatabaseAdd(IN PRTL_TRACE_DATABASE Database,
64 IN ULONG Count,
65 IN PVOID *Trace,
66 OUT OPTIONAL PRTL_TRACE_BLOCK *TraceBlock)
67{
68 UNIMPLEMENTED;
69 return FALSE;
70}
71
72PRTL_TRACE_DATABASE
73NTAPI
74RtlTraceDatabaseCreate(IN ULONG Buckets,
75 IN OPTIONAL SIZE_T MaximumSize,
76 IN ULONG Flags,
77 IN ULONG Tag,
78 IN OPTIONAL RTL_TRACE_HASH_FUNCTION HashFunction)
79{
80 UNIMPLEMENTED;
81 return NULL;
82}
83
84BOOLEAN
85NTAPI
86RtlTraceDatabaseDestroy(IN PRTL_TRACE_DATABASE Database)
87{
88 UNIMPLEMENTED;
89 return FALSE;
90}
91
92BOOLEAN
93NTAPI
94RtlTraceDatabaseEnumerate(IN PRTL_TRACE_DATABASE Database,
95 IN PRTL_TRACE_ENUMERATE TraceEnumerate,
96 IN OUT PRTL_TRACE_BLOCK *TraceBlock)
97{
98 UNIMPLEMENTED;
99 return FALSE;
100}
101
102
103BOOLEAN
104NTAPI
105RtlTraceDatabaseFind(IN PRTL_TRACE_DATABASE Database,
106 IN ULONG Count,
107 IN PVOID *Trace,
108 OUT OPTIONAL PRTL_TRACE_BLOCK *TraceBlock)
109{
110 UNIMPLEMENTED;
111 return FALSE;
112}
113
114BOOLEAN
115NTAPI
116RtlTraceDatabaseLock(IN PRTL_TRACE_DATABASE Database)
117{
118 UNIMPLEMENTED;
119 return FALSE;
120}
121
122BOOLEAN
123NTAPI
124RtlTraceDatabaseUnlock(IN PRTL_TRACE_DATABASE Database)
125{
126 UNIMPLEMENTED;
127 return FALSE;
128}
129
130BOOLEAN
131NTAPI
132RtlTraceDatabaseValidate(IN PRTL_TRACE_DATABASE Database)
133{
134 UNIMPLEMENTED;
135 return FALSE;
136}