ReactOS 0.4.16-dev-1643-gf0ba726
misc.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS NDIS library
4 * FILE: ndis/misc.c
5 */
6
7#include "ndissys.h"
8
9extern LONG CancelId;
10
11/*
12 * @implemented
13 */
14#undef NdisInterlockedAddUlong
15VOID
21{
23}
24
25/*
26 * @implemented
27 */
28VOID
34{
35 /* This needs to be verified. The documentation
36 * seems to be missing but it is exported by
37 * NDIS 5.1 so I'm implementing it like the other
38 * interlocked routines
39 */
40
42}
43
44/*
45 * @implemented
46 */
47LONG
50 IN PNDIS_ANSI_STRING String1,
53{
54 /* This one needs to be verified also. See the
55 * comment in NdisInterlockedAddLargeInteger
56 */
57
59}
60
61/*
62 * @implemented
63 */
64LONG
67 IN PNDIS_STRING String1,
70{
71 /* This one needs to be verified also. See the
72 * comment in NdisInterlockedAddLargeInteger
73 */
74
76}
77
78/*
79 * @implemented
80 */
81#undef NdisInterlockedInsertHeadList
85 IN PLIST_ENTRY ListHead,
86 IN PLIST_ENTRY ListEntry,
88{
89 return ExInterlockedInsertHeadList ( ListHead, ListEntry, &SpinLock->SpinLock );
90}
91
92/*
93 * @implemented
94 */
95#undef NdisInterlockedInsertTailList
99 IN PLIST_ENTRY ListHead,
100 IN PLIST_ENTRY ListEntry,
102{
103 return ExInterlockedInsertTailList ( ListHead, ListEntry, &SpinLock->SpinLock );
104}
105
106
107/*
108 * @implemented
109 */
110#undef NdisInterlockedRemoveHeadList
112EXPORT
114 IN PLIST_ENTRY ListHead,
116{
117 return ExInterlockedRemoveHeadList ( ListHead, &SpinLock->SpinLock );
118}
119
121{
126
130{
132}
133
137{
138 return (NDIS_HANDLE)obj;
139}
140
141static const WCHAR NDIS_FILE_FOLDER[] = L"\\SystemRoot\\System32\\Drivers\\";
142
143/*
144 * @implemented
145 */
146VOID
147EXPORT
152{
154
155 NDIS_DbgPrint(MAX_TRACE, ("called: FileHandle 0x%x\n", FileHandle));
156
157 if (HandleObject->Mapped)
158 {
159 /* If a file already mapped we will return an error code */
160 NDIS_DbgPrint(MIN_TRACE, ("File already mapped\n"));
162 return;
163 }
164
165 HandleObject->Mapped = TRUE;
166 *MappedBuffer = HandleObject->MapBuffer;
167
168 /* Set returned status */
170}
171
172/*
173 * @implemented
174 */
175VOID
176EXPORT
179{
181
182 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
183
184 HandleObject->Mapped = FALSE;
185}
186
187/*
188 * @implemented
189 */
190VOID
191EXPORT
194{
195 PNDIS_HANDLE_OBJECT FileHandleObject;
196
198
199 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
200
201 ASSERT ( FileHandle );
202
203 FileHandleObject = NDIS_HANDLE_TO_POBJECT(FileHandle);
204
205 if ( FileHandleObject->MapBuffer )
206 ExFreePool ( FileHandleObject->MapBuffer );
207 ExFreePool ( FileHandleObject );
208}
209
210
211/*
212 * @implemented
213 */
214VOID
215EXPORT
222{
223 HANDLE NtFileHandle = NULL;
224 NDIS_STRING FullFileName;
226 PNDIS_HANDLE_OBJECT FileHandleObject = NULL;
228 FILE_STANDARD_INFORMATION StandardInfo;
229 UINT NtFileLength;
230 NTSTATUS NtStatus;
231
233
234 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
235
236 ASSERT ( Status && FileName );
237
239 FullFileName.Buffer = NULL;
240
241 FullFileName.Length = sizeof(NDIS_FILE_FOLDER) - sizeof(UNICODE_NULL);
242 FullFileName.MaximumLength = FileName->MaximumLength + FullFileName.Length;
243 FullFileName.Buffer = ExAllocatePool ( NonPagedPool, FullFileName.MaximumLength );
244
245 if ( !FullFileName.Buffer )
246 {
247 NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources\n"));
249 goto cleanup;
250 }
251
252 FileHandleObject = ExAllocatePool ( NonPagedPool, sizeof(NDIS_HANDLE_OBJECT) );
253 if ( !FileHandleObject )
254 {
255 NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources\n"));
257 goto cleanup;
258 }
259 memset ( FileHandleObject, 0, sizeof(NDIS_HANDLE_OBJECT) );
260
261 memmove ( FullFileName.Buffer, NDIS_FILE_FOLDER, FullFileName.Length );
262 NtStatus = RtlAppendUnicodeStringToString ( &FullFileName, FileName );
263 if ( !NT_SUCCESS(NtStatus) )
264 {
265 NDIS_DbgPrint(MIN_TRACE, ("RtlAppendUnicodeStringToString failed (%x)\n", NtStatus));
267 goto cleanup;
268 }
269
271 &FullFileName,
273 NULL,
274 NULL );
275
276 NtStatus = ZwCreateFile (
277 &NtFileHandle,
281 NULL, // PLARGE_INTEGER AllocationSize
282 0, // ULONG FileAttributes
283 FILE_SHARE_READ, // ULONG ShareAccess
284 FILE_OPEN, // ULONG CreateDisposition
285 FILE_SYNCHRONOUS_IO_NONALERT, // ULONG CreateOptions
286 0, // PVOID EaBuffer
287 0 ); // ULONG EaLength
288
289 if ( !NT_SUCCESS(NtStatus) )
290 {
291 NDIS_DbgPrint(MIN_TRACE, ("ZwCreateFile failed (%x) Name %wZ\n", NtStatus, FileName));
293 goto cleanup;
294 }
295
296 NtStatus = ZwQueryInformationFile(
297 NtFileHandle,
299 &StandardInfo,
300 sizeof(StandardInfo),
302 if (!NT_SUCCESS(NtStatus))
303 {
304 NDIS_DbgPrint(MIN_TRACE, ("ZwQueryInformationFile failed (%x) Name %wZ\n", NtStatus, FileName));
306 goto cleanup;
307 }
308 if (StandardInfo.EndOfFile.HighPart != 0 || StandardInfo.EndOfFile.LowPart == 0)
309 {
310 NDIS_DbgPrint(MIN_TRACE, ("ZwQueryInformationFile failed Name %wZ\n", FileName));
312 goto cleanup;
313 }
314 NtFileLength = StandardInfo.EndOfFile.LowPart;
315
316 FileHandleObject->MapBuffer = ExAllocatePool( NonPagedPool, NtFileLength );
317 if (!FileHandleObject->MapBuffer)
318 {
319 NDIS_DbgPrint(MIN_TRACE, ("ExAllocatePool failed Name %wZ\n", FileName));
321 goto cleanup;
322 }
323
324 NtStatus = ZwReadFile(
325 NtFileHandle,
326 NULL,
327 NULL,
328 NULL,
330 FileHandleObject->MapBuffer,
331 NtFileLength,
332 NULL,
333 NULL);
334 if ( !NT_SUCCESS(NtStatus) || IoStatusBlock.Information != NtFileLength )
335 {
336 NDIS_DbgPrint(MIN_TRACE, ("ZwReadFile failed (%x) Name %wZ\n", NtStatus, FileName));
338 goto cleanup;
339 }
340
341cleanup:
342 if ( NtFileHandle != NULL )
343 {
344 ZwClose( NtFileHandle );
345 }
346 if ( FullFileName.Buffer != NULL )
347 {
348 ExFreePool ( FullFileName.Buffer );
349 FullFileName.Buffer = NULL;
350 }
351 if ( !NT_SUCCESS(*Status) )
352 {
353 if ( FileHandleObject )
354 {
355 if ( FileHandleObject->MapBuffer )
356 ExFreePool( FileHandleObject->MapBuffer );
357 ExFreePool ( FileHandleObject );
358 }
359 *FileHandle = NULL;
360 }
361 else
362 {
363 *FileHandle = NDIS_POBJECT_TO_HANDLE(FileHandleObject);
364 *FileLength = NtFileLength;
365 }
366}
367
368/*
369 * @implemented
370 */
371CCHAR
372EXPORT
374 VOID)
375{
376 return KeNumberProcessors;
377}
378
379
380/*
381 * @implemented
382 */
383VOID
384EXPORT
386 OUT PULONG pIdleCount,
389/*
390 * FUNCTION:
391 * ARGUMENTS:
392 * NOTES:
393 * NDIS 5.0
394 */
395{
396 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
397
399}
400
401
402/*
403 * @implemented
404 */
405VOID
406EXPORT
408{
410 LARGE_INTEGER TickCount;
411
412 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
413
414 /* Get the increment and current tick count */
416 KeQueryTickCount(&TickCount);
417
418 /* Convert to milliseconds and return */
419 TickCount.QuadPart *= Increment;
420 TickCount.QuadPart /= (10 * 1000);
421 *pSystemUpTime = TickCount.LowPart;
422}
423
424/*
425 * @implemented
426 */
427#undef NdisInterlockedDecrement
428LONG
429EXPORT
432/*
433 * FUNCTION:
434 * ARGUMENTS:
435 * NOTES:
436 * NDIS 5.0
437 */
438{
439 return InterlockedDecrement ( Addend );
440}
441
442
443/*
444 * @implemented
445 */
446#undef NdisInterlockedIncrement
447LONG
448EXPORT
451/*
452 * FUNCTION:
453 * ARGUMENTS:
454 * NOTES:
455 * NDIS 5.0
456 */
457{
458 return InterlockedIncrement ( Addend );
459}
460
461
462/*
463 * @implemented
464 */
465#undef NdisInterlockedPopEntrySList
467EXPORT
469 IN PSLIST_HEADER ListHead,
471/*
472 * FUNCTION:
473 * ARGUMENTS:
474 * NOTES:
475 * NDIS 5.0
476 */
477{
479}
480
481
482/*
483 * @implemented
484 */
485#undef NdisInterlockedPushEntrySList
487EXPORT
489 IN PSLIST_HEADER ListHead,
490 IN PSINGLE_LIST_ENTRY ListEntry,
492/*
493 * FUNCTION:
494 * ARGUMENTS:
495 * NOTES:
496 * NDIS 5.0
497 */
498{
499 return (PSINGLE_LIST_ENTRY)ExInterlockedPushEntrySList ( ListHead, (PSLIST_ENTRY)ListEntry, Lock );
500}
501
502
503VOID
504NTAPI
506{
507 PNDIS_WORK_ITEM pNdisItem = (PNDIS_WORK_ITEM)pContext;
508
509 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
510
511 pNdisItem->Routine(pNdisItem, pNdisItem->Context);
512}
513
515EXPORT
517 IN PNDIS_WORK_ITEM pWorkItem)
518{
519 PWORK_QUEUE_ITEM pntWorkItem = (PWORK_QUEUE_ITEM)pWorkItem->WrapperReserved;
520
521 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
522
523 ExInitializeWorkItem(pntWorkItem, ndisProcWorkItemHandler, pWorkItem);
524 ExQueueWorkItem(pntWorkItem, DelayedWorkQueue);
525 return NDIS_STATUS_SUCCESS;
526}
527
528/*
529 * @implemented
530 */
531VOID
532EXPORT
534 PULONG pCpuUsage)
535/*
536 * FUNCTION: Returns how busy the current processor is as a percentage
537 * ARGUMENTS:
538 * pCpuUsage = Pointer to a buffer to place CPU usage
539 */
540{
541 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
542
544}
545
546/*
547 * @implemented
548 */
549ULONG
550EXPORT
552{
553 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
554
556}
557
558/*
559 * @implemented
560 */
561UINT
562EXPORT
564{
565 NDIS_DbgPrint(MAX_TRACE, ("Called.\n"));
566
567 return NDIS_VERSION;
568}
569
570/*
571 * @implemented
572 */
573UCHAR
574EXPORT
576{
577 UCHAR PartialCancelId;
578
579 PartialCancelId = (UCHAR)InterlockedIncrement(&CancelId);
580
581 NDIS_DbgPrint(MAX_TRACE, ("Cancel ID %u\n", PartialCancelId));
582
583 return PartialCancelId;
584}
585
586/* EOF */
unsigned char BOOLEAN
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
LONG NTSTATUS
Definition: precomp.h:26
#define MIN_TRACE
Definition: debug.h:14
#define MAX_TRACE
Definition: debug.h:16
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define FILE_SHARE_READ
Definition: compat.h:136
static void cleanup(void)
Definition: main.c:1335
#define L(x)
Definition: resources.c:13
#define ASSERT_IRQL(x)
Definition: debug.h:42
#define NDIS_DbgPrint(_t_, _x_)
Definition: debug.h:40
VOID EXPORT NdisInterlockedAddLargeInteger(IN PLARGE_INTEGER Addend, IN LARGE_INTEGER Increment, IN PNDIS_SPIN_LOCK SpinLock)
Definition: misc.c:30
VOID EXPORT NdisGetCurrentProcessorCounts(OUT PULONG pIdleCount, OUT PULONG pKernelAndUser, OUT PULONG pIndex)
Definition: misc.c:385
LONG EXPORT NdisCompareAnsiString(IN PNDIS_ANSI_STRING String1, IN PNDIS_ANSI_STRING String2, BOOLEAN CaseInSensitive)
Definition: misc.c:49
FORCEINLINE PNDIS_HANDLE_OBJECT NDIS_HANDLE_TO_POBJECT(NDIS_HANDLE handle)
Definition: misc.c:129
VOID EXPORT NdisOpenFile(OUT PNDIS_STATUS Status, OUT PNDIS_HANDLE FileHandle, OUT PUINT FileLength, IN PNDIS_STRING FileName, IN NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress)
Definition: misc.c:216
static const WCHAR NDIS_FILE_FOLDER[]
Definition: misc.c:141
FORCEINLINE NDIS_HANDLE NDIS_POBJECT_TO_HANDLE(PNDIS_HANDLE_OBJECT obj)
Definition: misc.c:136
VOID EXPORT NdisGetCurrentProcessorCpuUsage(PULONG pCpuUsage)
Definition: misc.c:533
UINT EXPORT NdisGetVersion(VOID)
Definition: misc.c:563
NDIS_STATUS EXPORT NdisScheduleWorkItem(IN PNDIS_WORK_ITEM pWorkItem)
Definition: misc.c:516
VOID EXPORT NdisMapFile(OUT PNDIS_STATUS Status, OUT PVOID *MappedBuffer, IN NDIS_HANDLE FileHandle)
Definition: misc.c:148
LONG CancelId
Definition: main.c:23
LONG EXPORT NdisCompareUnicodeString(IN PNDIS_STRING String1, IN PNDIS_STRING String2, IN BOOLEAN CaseInSensitive)
Definition: misc.c:66
struct _NDIS_HANDLE_OBJECT * PNDIS_HANDLE_OBJECT
ULONG EXPORT NdisGetSharedDataAlignment(VOID)
Definition: misc.c:551
VOID EXPORT NdisCloseFile(IN NDIS_HANDLE FileHandle)
Definition: misc.c:192
VOID EXPORT NdisUnmapFile(IN NDIS_HANDLE FileHandle)
Definition: misc.c:177
UCHAR EXPORT NdisGeneratePartialCancelId(VOID)
Definition: misc.c:575
CCHAR EXPORT NdisSystemProcessorCount(VOID)
Definition: misc.c:373
VOID EXPORT NdisGetSystemUpTime(OUT PULONG pSystemUpTime)
Definition: misc.c:407
struct _NDIS_HANDLE_OBJECT NDIS_HANDLE_OBJECT
VOID NTAPI ndisProcWorkItemHandler(PVOID pContext)
Definition: misc.c:505
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
ULONG RtlCompareUnicodeString(PUNICODE_STRING s1, PUNICODE_STRING s2, BOOLEAN UpCase)
Definition: string_lib.cpp:31
KSPIN_LOCK * PKSPIN_LOCK
Definition: env_spec_w32.h:73
#define ExFreePool(addr)
Definition: env_spec_w32.h:352
#define NonPagedPool
Definition: env_spec_w32.h:307
#define ExAllocatePool(type, size)
Definition: fbtusb.h:44
IN OUT PLONG Addend
Definition: CrNtStubs.h:25
IN OUT PLONG IN OUT PLONG Addend IN OUT PLONG IN LONG Increment
Definition: CrNtStubs.h:46
_Must_inspect_result_ _In_opt_ PFLT_INSTANCE _Out_ PHANDLE FileHandle
Definition: fltkernel.h:1231
#define FILE_OPEN
Definition: from_kernel.h:54
#define FILE_SYNCHRONOUS_IO_NONALERT
Definition: from_kernel.h:31
Status
Definition: gdiplustypes.h:25
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
ULONG NTAPI ExInterlockedAddUlong(IN OUT PULONG Addend, IN ULONG Increment, IN OUT PKSPIN_LOCK Lock)
Definition: interlocked.c:88
PLIST_ENTRY NTAPI ExInterlockedInsertHeadList(IN OUT PLIST_ENTRY ListHead, IN OUT PLIST_ENTRY ListEntry, IN OUT PKSPIN_LOCK Lock)
Definition: interlocked.c:114
PLIST_ENTRY NTAPI ExInterlockedInsertTailList(IN OUT PLIST_ENTRY ListHead, IN OUT PLIST_ENTRY ListEntry, IN OUT PKSPIN_LOCK Lock)
Definition: interlocked.c:140
LARGE_INTEGER NTAPI ExInterlockedAddLargeInteger(IN OUT PLARGE_INTEGER Addend, IN LARGE_INTEGER Increment, IN OUT PKSPIN_LOCK Lock)
Definition: interlocked.c:62
PLIST_ENTRY NTAPI ExInterlockedRemoveHeadList(IN OUT PLIST_ENTRY ListHead, IN OUT PKSPIN_LOCK Lock)
Definition: interlocked.c:166
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
#define ASSERT(a)
Definition: mode.c:44
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
#define NdisInterlockedIncrement(Addend)
Definition: ndis.h:4386
_Out_ PULONG _Out_ PULONG pIndex
Definition: ndis.h:4565
unsigned int * PUINT
Definition: ndis.h:50
unsigned int UINT
Definition: ndis.h:50
#define NdisInterlockedRemoveHeadList(_ListHead, _SpinLock)
Definition: ndis.h:4342
_Out_ PULONG pKernelAndUser
Definition: ndis.h:4564
#define NdisInterlockedInsertTailList(_ListHead, _ListEntry, _SpinLock)
Definition: ndis.h:4333
#define NDIS_STATUS_FAILURE
Definition: ndis.h:465
struct _NDIS_WORK_ITEM * PNDIS_WORK_ITEM
_Out_ PNDIS_HANDLE _Out_ PUINT FileLength
Definition: ndis.h:3228
#define NDIS_STATUS_FILE_NOT_FOUND
Definition: ndis.h:492
#define NdisInterlockedAddUlong(_Addend, _Increment, _SpinLock)
Definition: ndis.h:4395
#define NDIS_STATUS_SUCCESS
Definition: ndis.h:346
#define NDIS_STATUS_ALREADY_MAPPED
Definition: ndis.h:494
#define NdisInterlockedPushEntrySList(SListHead, SListEntry, Lock)
Definition: ndis.h:5268
#define NdisInterlockedDecrement(Addend)
Definition: ndis.h:4379
#define NDIS_STATUS_ERROR_READING_FILE
Definition: ndis.h:493
_Out_ PVOID * MappedBuffer
Definition: ndis.h:3245
* PNDIS_STATUS
Definition: ndis.h:45
_Out_ PNDIS_HANDLE _Out_ PUINT _In_ PNDIS_STRING _In_ NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress
Definition: ndis.h:3230
#define NdisInterlockedInsertHeadList(_ListHead, _ListEntry, _SpinLock)
Definition: ndis.h:4323
#define NDIS_STATUS_RESOURCES
Definition: ndis.h:466
#define NdisInterlockedPopEntrySList(SListHead, Lock)
Definition: ndis.h:5256
VOID NTAPI ExGetCurrentProcessorCounts(PULONG IdleTime, PULONG KernelAndUserTime, PULONG ProcessorNumber)
Definition: sysinfo.c:345
#define NDIS_VERSION
Definition: ndissys.h:27
VOID NTAPI ExGetCurrentProcessorCpuUsage(PULONG CpuUsage)
Definition: sysinfo.c:324
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
_In_ const STRING * String2
Definition: rtlfuncs.h:2396
_In_ const STRING _In_ BOOLEAN CaseInSensitive
Definition: rtlfuncs.h:2429
#define SYNCHRONIZE
Definition: nt_native.h:61
#define FILE_READ_DATA
Definition: nt_native.h:628
NTSYSAPI NTSTATUS NTAPI RtlAppendUnicodeStringToString(PUNICODE_STRING Destination, PUNICODE_STRING Source)
NTSYSAPI LONG NTAPI RtlCompareString(PSTRING String1, PSTRING String2, BOOLEAN CaseInSensitive)
#define UNICODE_NULL
int NDIS_STATUS
Definition: ntddndis.h:496
static OUT PIO_STATUS_BLOCK IoStatusBlock
Definition: pipe.c:75
ULONG NTAPI KeGetRecommendedSharedDataAlignment(VOID)
Definition: cpu.c:709
ULONG NTAPI KeQueryTimeIncrement(VOID)
Definition: clock.c:153
CCHAR KeNumberProcessors
Definition: processor.c:19
long LONG
Definition: pedump.c:60
#define KeQueryTickCount(CurrentCount)
Definition: ke.h:43
#define memset(x, y, z)
Definition: compat.h:39
#define FileStandardInformation
Definition: propsheet.cpp:61
#define STATUS_SUCCESS
Definition: shellext.h:65
Definition: typedefs.h:120
BOOLEAN Mapped
Definition: misc.c:122
PVOID MapBuffer
Definition: misc.c:124
ULONG FileLength
Definition: misc.c:123
PVOID Context
Definition: ndis.h:2318
NDIS_PROC Routine
Definition: ndis.h:2319
Definition: ntbasedef.h:640
USHORT MaximumLength
Definition: env_spec_w32.h:370
uint32_t * PULONG
Definition: typedefs.h:59
#define NTAPI
Definition: typedefs.h:36
#define IN
Definition: typedefs.h:39
int32_t * PLONG
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
char CCHAR
Definition: typedefs.h:51
LONGLONG QuadPart
Definition: typedefs.h:114
ULONG LowPart
Definition: typedefs.h:106
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFSPINLOCK * SpinLock
Definition: wdfsync.h:228
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWAITLOCK * Lock
Definition: wdfsync.h:127
#define FORCEINLINE
Definition: wdftypes.h:67
VOID NTAPI ExQueueWorkItem(IN PWORK_QUEUE_ITEM WorkItem, IN WORK_QUEUE_TYPE QueueType)
Definition: work.c:723
#define ExInterlockedPushEntrySList(SListHead, SListEntry, Lock)
Definition: exfuncs.h:163
#define ExInitializeWorkItem(Item, Routine, Context)
Definition: exfuncs.h:265
#define ExInterlockedPopEntrySList(SListHead, Lock)
Definition: exfuncs.h:166
@ DelayedWorkQueue
Definition: extypes.h:190
struct _WORK_QUEUE_ITEM * PWORK_QUEUE_ITEM
#define PSLIST_ENTRY
Definition: rtltypes.h:134
unsigned char UCHAR
Definition: xmlstorage.h:181
__wchar_t WCHAR
Definition: xmlstorage.h:180