2 * Helper functions for ntdll
4 * Copyright 2000 Juergen Schmied
5 * Copyright 2010 Marcus Meissner
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
25 #define WIN32_NO_STATUS
26 #include "wine/debug.h"
27 #include "ntdll_misc.h"
32 WINE_DEFAULT_DEBUG_CHANNEL(ntdll
);
34 LPCSTR
debugstr_us( const UNICODE_STRING
*us
)
36 if (!us
) return "<null>";
37 return debugstr_wn(us
->Buffer
, us
->Length
/ sizeof(WCHAR
));
41 NTDLL_mergesort( void *arr
, void *barr
, size_t elemsize
, int(__cdecl
*compar
)(const void *, const void *),
42 size_t left
, size_t right
)
46 m
=left
+(right
-left
)/2;
47 NTDLL_mergesort( arr
, barr
, elemsize
, compar
, left
, m
);
48 NTDLL_mergesort( arr
, barr
, elemsize
, compar
, m
+1, right
);
50 #define X(a,i) ((char*)a+elemsize*(i))
51 for (k
=left
, i
=left
, j
=m
+1; i
<=m
&& j
<=right
; k
++) {
52 if (compar(X(arr
, i
), X(arr
,j
)) <= 0) {
53 memcpy(X(barr
,k
), X(arr
, i
), elemsize
);
56 memcpy(X(barr
,k
), X(arr
, j
), elemsize
);
61 memcpy(X(barr
,k
), X(arr
,i
), (m
-i
+1)*elemsize
);
63 memcpy(X(barr
,k
), X(arr
,j
), (right
-j
+1)*elemsize
);
65 memcpy(X(arr
, left
), X(barr
, left
), (right
-left
+1)*elemsize
);
70 /*********************************************************************
73 void __cdecl
qsort( void *base
, size_t nmemb
, size_t size
,
74 int (__cdecl
*compar
)(const void *, const void *) )
77 if (nmemb
< 2 || size
== 0) return;
78 secondarr
= RtlAllocateHeap (GetProcessHeap(), 0, nmemb
*size
);
79 NTDLL_mergesort( base
, secondarr
, size
, compar
, 0, nmemb
-1 );
80 RtlFreeHeap (GetProcessHeap(),0, secondarr
);
83 /*********************************************************************
86 void * __cdecl
bsearch( const void *key
, const void *base
, size_t nmemb
,
87 size_t size
, int (__cdecl
*compar
)(const void *, const void *) )
90 ssize_t max
= nmemb
- 1;
94 ssize_t cursor
= min
+ (max
- min
) / 2;
95 int ret
= compar(key
,(const char *)base
+(cursor
*size
));
97 return (char*)base
+(cursor
*size
);
107 /*********************************************************************
110 void * __cdecl
_lfind( const void *key
, const void *base
, unsigned int *nmemb
,
111 size_t size
, int(__cdecl
*compar
)(const void *, const void *) )
113 size_t i
, n
= *nmemb
;
116 if (!compar(key
,(char*)base
+(size
*i
)))
117 return (char*)base
+(size
*i
);
121 /******************************************************************************
122 * WinSqmEndSession (NTDLL.@)
124 NTSTATUS WINAPI
WinSqmEndSession(HANDLE session
)
126 FIXME("(%p): stub\n", session
);
127 return STATUS_NOT_IMPLEMENTED
;
130 /*********************************************************************
131 * WinSqmIncrementDWORD (NTDLL.@)
133 void WINAPI
WinSqmIncrementDWORD(DWORD unk1
, DWORD unk2
, DWORD unk3
)
135 FIXME("(%d, %d, %d): stub\n", unk1
, unk2
, unk3
);
138 /*********************************************************************
139 * WinSqmIsOptedIn (NTDLL.@)
141 BOOL WINAPI
WinSqmIsOptedIn(void)
147 /******************************************************************************
148 * WinSqmStartSession (NTDLL.@)
150 HANDLE WINAPI
WinSqmStartSession(GUID
*sessionguid
, DWORD sessionid
, DWORD unknown1
)
152 FIXME("(%p, 0x%x, 0x%x): stub\n", sessionguid
, sessionid
, unknown1
);
153 return INVALID_HANDLE_VALUE
;
156 /***********************************************************************
157 * WinSqmSetDWORD (NTDLL.@)
159 void WINAPI
WinSqmSetDWORD(HANDLE session
, DWORD datapoint_id
, DWORD datapoint_value
)
161 FIXME("(%p, %d, %d): stub\n", session
, datapoint_id
, datapoint_value
);
164 /******************************************************************************
165 * EtwEventActivityIdControl (NTDLL.@)
167 ULONG WINAPI
EtwEventActivityIdControl(ULONG code
, GUID
*guid
)
171 if (!once
++) FIXME("0x%x, %p: stub\n", code
, guid
);
172 return ERROR_SUCCESS
;
175 /******************************************************************************
176 * EtwEventProviderEnabled (NTDLL.@)
178 BOOLEAN WINAPI
EtwEventProviderEnabled( REGHANDLE handle
, UCHAR level
, ULONGLONG keyword
)
180 WARN("%s, %u, %s: stub\n", wine_dbgstr_longlong(handle
), level
, wine_dbgstr_longlong(keyword
));
184 /******************************************************************************
185 * EtwEventRegister (NTDLL.@)
187 ULONG WINAPI
EtwEventRegister( LPCGUID provider
, PENABLECALLBACK callback
, PVOID context
,
190 WARN("(%s, %p, %p, %p) stub.\n", debugstr_guid(provider
), callback
, context
, handle
);
192 if (!handle
) return ERROR_INVALID_PARAMETER
;
194 *handle
= 0xdeadbeef;
195 return ERROR_SUCCESS
;
198 /******************************************************************************
199 * EtwEventUnregister (NTDLL.@)
201 ULONG WINAPI
EtwEventUnregister( REGHANDLE handle
)
203 WARN("(%s) stub.\n", wine_dbgstr_longlong(handle
));
204 return ERROR_SUCCESS
;
207 /*********************************************************************
208 * EtwEventSetInformation (NTDLL.@)
210 ULONG WINAPI
EtwEventSetInformation( REGHANDLE handle
, EVENT_INFO_CLASS
class, void *info
,
213 FIXME("(%s, %u, %p, %u) stub\n", wine_dbgstr_longlong(handle
), class, info
, length
);
214 return ERROR_SUCCESS
;
217 /******************************************************************************
218 * EtwEventWriteString (NTDLL.@)
220 ULONG WINAPI
EtwEventWriteString( REGHANDLE handle
, UCHAR level
, ULONGLONG keyword
, PCWSTR string
)
222 FIXME("%s, %u, %s, %s: stub\n", wine_dbgstr_longlong(handle
), level
,
223 wine_dbgstr_longlong(keyword
), debugstr_w(string
));
224 return ERROR_SUCCESS
;
227 /******************************************************************************
228 * EtwEventWriteTransfer (NTDLL.@)
230 ULONG WINAPI
EtwEventWriteTransfer( REGHANDLE handle
, PCEVENT_DESCRIPTOR descriptor
, LPCGUID activity
,
231 LPCGUID related
, ULONG count
, PEVENT_DATA_DESCRIPTOR data
)
233 FIXME("%s, %p, %s, %s, %u, %p: stub\n", wine_dbgstr_longlong(handle
), descriptor
,
234 debugstr_guid(activity
), debugstr_guid(related
), count
, data
);
235 return ERROR_SUCCESS
;
238 /******************************************************************************
239 * EtwRegisterTraceGuidsW (NTDLL.@)
241 * Register an event trace provider and the event trace classes that it uses
242 * to generate events.
245 * RequestAddress [I] ControlCallback function
246 * RequestContext [I] Optional provider-defined context
247 * ControlGuid [I] GUID of the registering provider
248 * GuidCount [I] Number of elements in the TraceGuidReg array
249 * TraceGuidReg [I/O] Array of TRACE_GUID_REGISTRATION structures
250 * MofImagePath [I] not supported, set to NULL
251 * MofResourceName [I] not supported, set to NULL
252 * RegistrationHandle [O] Provider's registration handle
255 * Success: ERROR_SUCCESS
256 * Failure: System error code
258 ULONG WINAPI
EtwRegisterTraceGuidsW( WMIDPREQUEST RequestAddress
,
259 void *RequestContext
, const GUID
*ControlGuid
, ULONG GuidCount
,
260 TRACE_GUID_REGISTRATION
*TraceGuidReg
, const WCHAR
*MofImagePath
,
261 const WCHAR
*MofResourceName
, TRACEHANDLE
*RegistrationHandle
)
263 WARN("(%p, %p, %s, %u, %p, %s, %s, %p): stub\n", RequestAddress
, RequestContext
,
264 debugstr_guid(ControlGuid
), GuidCount
, TraceGuidReg
, debugstr_w(MofImagePath
),
265 debugstr_w(MofResourceName
), RegistrationHandle
);
270 for (i
= 0; i
< GuidCount
; i
++)
272 FIXME(" register trace class %s\n", debugstr_guid(TraceGuidReg
[i
].Guid
));
273 TraceGuidReg
[i
].RegHandle
= (HANDLE
)0xdeadbeef;
276 *RegistrationHandle
= (TRACEHANDLE
)0xdeadbeef;
277 return ERROR_SUCCESS
;
280 /******************************************************************************
281 * EtwRegisterTraceGuidsA (NTDLL.@)
283 ULONG WINAPI
EtwRegisterTraceGuidsA( WMIDPREQUEST RequestAddress
,
284 void *RequestContext
, const GUID
*ControlGuid
, ULONG GuidCount
,
285 TRACE_GUID_REGISTRATION
*TraceGuidReg
, const char *MofImagePath
,
286 const char *MofResourceName
, TRACEHANDLE
*RegistrationHandle
)
288 WARN("(%p, %p, %s, %u, %p, %s, %s, %p): stub\n", RequestAddress
, RequestContext
,
289 debugstr_guid(ControlGuid
), GuidCount
, TraceGuidReg
, debugstr_a(MofImagePath
),
290 debugstr_a(MofResourceName
), RegistrationHandle
);
291 return ERROR_SUCCESS
;
294 /******************************************************************************
295 * EtwUnregisterTraceGuids (NTDLL.@)
297 ULONG WINAPI
EtwUnregisterTraceGuids( TRACEHANDLE RegistrationHandle
)
299 if (!RegistrationHandle
)
300 return ERROR_INVALID_PARAMETER
;
302 WARN("%s: stub\n", wine_dbgstr_longlong(RegistrationHandle
));
303 return ERROR_SUCCESS
;
306 /******************************************************************************
307 * EtwEventEnabled (NTDLL.@)
309 BOOLEAN WINAPI
EtwEventEnabled( REGHANDLE handle
, const EVENT_DESCRIPTOR
*descriptor
)
311 WARN("(%s, %p): stub\n", wine_dbgstr_longlong(handle
), descriptor
);
315 /******************************************************************************
316 * EtwEventWrite (NTDLL.@)
318 ULONG WINAPI
EtwEventWrite( REGHANDLE handle
, const EVENT_DESCRIPTOR
*descriptor
, ULONG count
,
319 EVENT_DATA_DESCRIPTOR
*data
)
321 FIXME("(%s, %p, %u, %p): stub\n", wine_dbgstr_longlong(handle
), descriptor
, count
, data
);
322 return ERROR_SUCCESS
;
325 /******************************************************************************
326 * EtwGetTraceEnableFlags (NTDLL.@)
328 ULONG WINAPI
EtwGetTraceEnableFlags( TRACEHANDLE handle
)
330 FIXME("(%s) stub\n", wine_dbgstr_longlong(handle
));
334 /******************************************************************************
335 * EtwGetTraceEnableLevel (NTDLL.@)
337 UCHAR WINAPI
EtwGetTraceEnableLevel( TRACEHANDLE handle
)
339 FIXME("(%s) stub\n", wine_dbgstr_longlong(handle
));
340 return TRACE_LEVEL_VERBOSE
;
343 /******************************************************************************
344 * EtwGetTraceLoggerHandle (NTDLL.@)
346 TRACEHANDLE WINAPI
EtwGetTraceLoggerHandle( PVOID buf
)
348 FIXME("(%p) stub\n", buf
);
349 return INVALID_PROCESSTRACE_HANDLE
;
352 /******************************************************************************
353 * EtwLogTraceEvent (NTDLL.@)
355 ULONG WINAPI
EtwLogTraceEvent( TRACEHANDLE SessionHandle
, PEVENT_TRACE_HEADER EventTrace
)
357 FIXME("%s %p\n", wine_dbgstr_longlong(SessionHandle
), EventTrace
);
358 return ERROR_CALL_NOT_IMPLEMENTED
;
361 /******************************************************************************
362 * EtwTraceMessageVa (NTDLL.@)
364 ULONG WINAPI
EtwTraceMessageVa( TRACEHANDLE handle
, ULONG flags
, LPGUID guid
, USHORT number
,
367 FIXME("(%s %x %s %d) : stub\n", wine_dbgstr_longlong(handle
), flags
, debugstr_guid(guid
), number
);
368 return ERROR_SUCCESS
;
371 /******************************************************************************
372 * EtwTraceMessage (NTDLL.@)
374 ULONG WINAPIV
EtwTraceMessage( TRACEHANDLE handle
, ULONG flags
, LPGUID guid
, /*USHORT*/ ULONG number
, ... )
379 va_start( valist
, number
);
380 ret
= EtwTraceMessageVa( handle
, flags
, guid
, number
, valist
);