win32u: Move WM_WINE_UPDATEWINDOWSTATE implementation from user32.
[wine.git] / dlls / ntdll / misc.c
blobbce8d7db54e09343e645a9ba59ec12a93a71d174
1 /*
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
22 #include <time.h>
24 #include "ntstatus.h"
25 #define WIN32_NO_STATUS
26 #include "wine/debug.h"
27 #include "ntdll_misc.h"
28 #include "wmistr.h"
29 #include "evntrace.h"
30 #include "evntprov.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));
40 static void
41 NTDLL_mergesort( void *arr, void *barr, size_t elemsize, int(__cdecl *compar)(const void *, const void *),
42 size_t left, size_t right )
44 if(right>left) {
45 size_t i, j, k, m;
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);
54 i++;
55 } else {
56 memcpy(X(barr,k), X(arr, j), elemsize);
57 j++;
60 if (i<=m)
61 memcpy(X(barr,k), X(arr,i), (m-i+1)*elemsize);
62 else
63 memcpy(X(barr,k), X(arr,j), (right-j+1)*elemsize);
65 memcpy(X(arr, left), X(barr, left), (right-left+1)*elemsize);
67 #undef X
70 /*********************************************************************
71 * qsort (NTDLL.@)
73 void __cdecl qsort( void *base, size_t nmemb, size_t size,
74 int (__cdecl *compar)(const void *, const void *) )
76 void *secondarr;
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 /*********************************************************************
84 * bsearch (NTDLL.@)
86 void * __cdecl bsearch( const void *key, const void *base, size_t nmemb,
87 size_t size, int (__cdecl *compar)(const void *, const void *) )
89 ssize_t min = 0;
90 ssize_t max = nmemb - 1;
92 while (min <= max)
94 ssize_t cursor = min + (max - min) / 2;
95 int ret = compar(key,(const char *)base+(cursor*size));
96 if (!ret)
97 return (char*)base+(cursor*size);
98 if (ret < 0)
99 max = cursor - 1;
100 else
101 min = cursor + 1;
103 return NULL;
107 /*********************************************************************
108 * _lfind (NTDLL.@)
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;
115 for (i=0;i<n;i++)
116 if (!compar(key,(char*)base+(size*i)))
117 return (char*)base+(size*i);
118 return NULL;
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)
143 FIXME("(): stub\n");
144 return FALSE;
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)
169 static int once;
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));
181 return FALSE;
184 /******************************************************************************
185 * EtwEventRegister (NTDLL.@)
187 ULONG WINAPI EtwEventRegister( LPCGUID provider, PENABLECALLBACK callback, PVOID context,
188 PREGHANDLE handle )
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,
211 ULONG length )
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.
244 * PARAMS
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
254 * RETURNS
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);
267 if (TraceGuidReg)
269 ULONG i;
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);
312 return FALSE;
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));
331 return 0;
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,
365 va_list args )
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, ... )
376 va_list valist;
377 ULONG ret;
379 va_start( valist, number );
380 ret = EtwTraceMessageVa( handle, flags, guid, number, valist );
381 va_end( valist );
382 return ret;