2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS NDIS library
14 #undef NdisInterlockedAddUlong
17 NdisInterlockedAddUlong (
20 IN PNDIS_SPIN_LOCK SpinLock
)
22 ExInterlockedAddUlong ( Addend
, Increment
, &SpinLock
->SpinLock
);
30 NdisInterlockedAddLargeInteger(
31 IN PLARGE_INTEGER Addend
,
32 IN LARGE_INTEGER Increment
,
33 IN PNDIS_SPIN_LOCK SpinLock
)
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
41 ExInterlockedAddLargeInteger(Addend
, Increment
, &SpinLock
->SpinLock
);
49 NdisCompareAnsiString(
50 IN PNDIS_ANSI_STRING String1
,
51 IN PNDIS_ANSI_STRING String2
,
52 BOOLEAN CaseInSensitive
)
54 /* This one needs to be verified also. See the
55 * comment in NdisInterlockedAddLargeInteger
58 return RtlCompareString(String1
, String2
, CaseInSensitive
);
66 NdisCompareUnicodeString(
67 IN PNDIS_STRING String1
,
68 IN PNDIS_STRING String2
,
69 IN BOOLEAN CaseInSensitive
)
71 /* This one needs to be verified also. See the
72 * comment in NdisInterlockedAddLargeInteger
75 return RtlCompareUnicodeString(String1
, String2
, CaseInSensitive
);
81 #undef NdisInterlockedInsertHeadList
84 NdisInterlockedInsertHeadList(
85 IN PLIST_ENTRY ListHead
,
86 IN PLIST_ENTRY ListEntry
,
87 IN PNDIS_SPIN_LOCK SpinLock
)
89 return ExInterlockedInsertHeadList ( ListHead
, ListEntry
, &SpinLock
->SpinLock
);
95 #undef NdisInterlockedInsertTailList
98 NdisInterlockedInsertTailList(
99 IN PLIST_ENTRY ListHead
,
100 IN PLIST_ENTRY ListEntry
,
101 IN PNDIS_SPIN_LOCK SpinLock
)
103 return ExInterlockedInsertTailList ( ListHead
, ListEntry
, &SpinLock
->SpinLock
);
110 #undef NdisInterlockedRemoveHeadList
113 NdisInterlockedRemoveHeadList(
114 IN PLIST_ENTRY ListHead
,
115 IN PNDIS_SPIN_LOCK SpinLock
)
117 return ExInterlockedRemoveHeadList ( ListHead
, &SpinLock
->SpinLock
);
120 typedef struct _NDIS_HANDLE_OBJECT
126 } NDIS_HANDLE_OBJECT
, *PNDIS_HANDLE_OBJECT
;
130 NDIS_HANDLE_TO_POBJECT ( NDIS_HANDLE handle
)
132 return (PNDIS_HANDLE_OBJECT
)handle
;
137 NDIS_POBJECT_TO_HANDLE ( PNDIS_HANDLE_OBJECT obj
)
139 return (NDIS_HANDLE
)obj
;
142 static const WCHAR NDIS_FILE_FOLDER
[] = L
"\\SystemRoot\\System32\\Drivers\\";
150 OUT PNDIS_STATUS Status
,
151 OUT PVOID
*MappedBuffer
,
152 IN NDIS_HANDLE FileHandle
)
154 PNDIS_HANDLE_OBJECT HandleObject
= (PNDIS_HANDLE_OBJECT
) FileHandle
;
156 NDIS_DbgPrint(MAX_TRACE
, ("called: FileHandle 0x%x\n", FileHandle
));
158 if (HandleObject
->Mapped
)
160 /* If a file already mapped we will return an error code */
161 NDIS_DbgPrint(MIN_TRACE
, ("File already mapped\n"));
162 *Status
= NDIS_STATUS_ALREADY_MAPPED
;
166 HandleObject
->Mapped
= TRUE
;
167 *MappedBuffer
= HandleObject
->MapBuffer
;
169 /* Set returned status */
170 *Status
= STATUS_SUCCESS
;
179 IN NDIS_HANDLE FileHandle
)
181 PNDIS_HANDLE_OBJECT HandleObject
= (PNDIS_HANDLE_OBJECT
) FileHandle
;
183 NDIS_DbgPrint(MAX_TRACE
, ("Called.\n"));
185 HandleObject
->Mapped
= FALSE
;
194 IN NDIS_HANDLE FileHandle
)
196 PNDIS_HANDLE_OBJECT FileHandleObject
;
198 ASSERT_IRQL(PASSIVE_LEVEL
);
200 NDIS_DbgPrint(MAX_TRACE
, ("Called.\n"));
202 ASSERT ( FileHandle
);
204 FileHandleObject
= NDIS_HANDLE_TO_POBJECT(FileHandle
);
206 ASSERT ( FileHandleObject
->FileHandle
);
208 if ( FileHandleObject
->Mapped
)
209 NdisUnmapFile ( FileHandle
);
211 ZwClose ( FileHandleObject
->FileHandle
);
213 memset ( FileHandleObject
, 0, sizeof(NDIS_HANDLE_OBJECT
) );
215 ExFreePool ( FileHandleObject
);
225 OUT PNDIS_STATUS Status
,
226 OUT PNDIS_HANDLE FileHandle
,
227 OUT PUINT FileLength
,
228 IN PNDIS_STRING FileName
,
229 IN NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress
)
231 NDIS_STRING FullFileName
;
232 OBJECT_ATTRIBUTES ObjectAttributes
;
233 PNDIS_HANDLE_OBJECT FileHandleObject
= NULL
;
234 IO_STATUS_BLOCK IoStatusBlock
;
236 ASSERT_IRQL(PASSIVE_LEVEL
);
238 NDIS_DbgPrint(MAX_TRACE
, ("Called.\n"));
240 ASSERT ( Status
&& FileName
);
242 *Status
= NDIS_STATUS_SUCCESS
;
243 FullFileName
.Buffer
= NULL
;
245 FullFileName
.Length
= sizeof(NDIS_FILE_FOLDER
) - sizeof(UNICODE_NULL
);
246 FullFileName
.MaximumLength
= FileName
->MaximumLength
+ FullFileName
.Length
;
247 FullFileName
.Buffer
= ExAllocatePool ( NonPagedPool
, FullFileName
.MaximumLength
);
249 if ( !FullFileName
.Buffer
)
251 NDIS_DbgPrint(MIN_TRACE
, ("Insufficient resources\n"));
252 *Status
= NDIS_STATUS_RESOURCES
;
256 FileHandleObject
= ExAllocatePool ( NonPagedPool
, sizeof(NDIS_HANDLE_OBJECT
) );
257 if ( !FileHandleObject
)
259 NDIS_DbgPrint(MIN_TRACE
, ("Insufficient resources\n"));
260 *Status
= NDIS_STATUS_RESOURCES
;
263 memset ( FileHandleObject
, 0, sizeof(NDIS_HANDLE_OBJECT
) );
265 memmove ( FullFileName
.Buffer
, NDIS_FILE_FOLDER
, FullFileName
.Length
);
266 *Status
= RtlAppendUnicodeStringToString ( &FullFileName
, FileName
);
267 if ( !NT_SUCCESS(*Status
) )
269 NDIS_DbgPrint(MIN_TRACE
, ("RtlAppendUnicodeStringToString failed (%x)\n", *Status
));
270 *Status
= NDIS_STATUS_FAILURE
;
274 InitializeObjectAttributes ( &ObjectAttributes
,
276 OBJ_CASE_INSENSITIVE
|OBJ_KERNEL_HANDLE
,
280 *Status
= ZwCreateFile (
281 &FileHandleObject
->FileHandle
,
282 FILE_READ_DATA
|SYNCHRONIZE
,
285 NULL
, // PLARGE_INTEGER AllocationSize
286 0, // ULONG FileAttributes
287 FILE_SHARE_READ
, // ULONG ShareAccess
288 FILE_OPEN
, // ULONG CreateDisposition
289 FILE_SYNCHRONOUS_IO_NONALERT
, // ULONG CreateOptions
291 0 ); // ULONG EaLength
293 if ( !NT_SUCCESS(*Status
) )
295 NDIS_DbgPrint(MIN_TRACE
, ("ZwCreateFile failed (%x) Name %wZ\n", *Status
, FileName
));
296 *Status
= NDIS_STATUS_FAILURE
;
300 if ( FullFileName
.Buffer
!= NULL
)
302 ExFreePool ( FullFileName
.Buffer
);
303 FullFileName
.Buffer
= NULL
;
305 if ( !NT_SUCCESS(*Status
) )
307 if( FileHandleObject
) {
308 ExFreePool ( FileHandleObject
);
309 FileHandleObject
= NULL
;
314 *FileHandle
= NDIS_POBJECT_TO_HANDLE(FileHandleObject
);
324 NdisSystemProcessorCount(
327 return (CCHAR
)KeNumberProcessors
;
336 NdisGetCurrentProcessorCounts(
337 OUT PULONG pIdleCount
,
338 OUT PULONG pKernelAndUser
,
347 NDIS_DbgPrint(MAX_TRACE
, ("Called.\n"));
349 ExGetCurrentProcessorCounts( (PULONG
) pIdleCount
, (PULONG
) pKernelAndUser
, (PULONG
) pIndex
);
358 NdisGetSystemUpTime(OUT PULONG pSystemUpTime
)
361 LARGE_INTEGER TickCount
;
363 NDIS_DbgPrint(MAX_TRACE
, ("Called.\n"));
365 /* Get the increment and current tick count */
366 Increment
= KeQueryTimeIncrement();
367 KeQueryTickCount(&TickCount
);
369 /* Convert to milliseconds and return */
370 TickCount
.QuadPart
*= Increment
;
371 TickCount
.QuadPart
/= (10 * 1000);
372 *pSystemUpTime
= TickCount
.LowPart
;
378 #undef NdisInterlockedDecrement
381 NdisInterlockedDecrement(
390 return InterlockedDecrement ( Addend
);
397 #undef NdisInterlockedIncrement
400 NdisInterlockedIncrement(
409 return InterlockedIncrement ( Addend
);
416 #undef NdisInterlockedPopEntrySList
419 NdisInterlockedPopEntrySList(
420 IN PSLIST_HEADER ListHead
,
429 return (PSINGLE_LIST_ENTRY
)ExInterlockedPopEntrySList ( ListHead
, Lock
);
436 #undef NdisInterlockedPushEntrySList
439 NdisInterlockedPushEntrySList(
440 IN PSLIST_HEADER ListHead
,
441 IN PSINGLE_LIST_ENTRY ListEntry
,
450 return (PSINGLE_LIST_ENTRY
)ExInterlockedPushEntrySList ( ListHead
, (PSLIST_ENTRY
)ListEntry
, Lock
);
456 ndisProcWorkItemHandler(PVOID pContext
)
458 PNDIS_WORK_ITEM pNdisItem
= (PNDIS_WORK_ITEM
)pContext
;
460 NDIS_DbgPrint(MAX_TRACE
, ("Called.\n"));
462 pNdisItem
->Routine(pNdisItem
, pNdisItem
->Context
);
467 NdisScheduleWorkItem(
468 IN PNDIS_WORK_ITEM pWorkItem
)
470 PWORK_QUEUE_ITEM pntWorkItem
= (PWORK_QUEUE_ITEM
)pWorkItem
->WrapperReserved
;
472 NDIS_DbgPrint(MAX_TRACE
, ("Called.\n"));
474 ExInitializeWorkItem(pntWorkItem
, ndisProcWorkItemHandler
, pWorkItem
);
475 ExQueueWorkItem(pntWorkItem
, DelayedWorkQueue
);
476 return NDIS_STATUS_SUCCESS
;
484 NdisGetCurrentProcessorCpuUsage(
487 * FUNCTION: Returns how busy the current processor is as a percentage
489 * pCpuUsage = Pointer to a buffer to place CPU usage
492 NDIS_DbgPrint(MAX_TRACE
, ("Called.\n"));
494 ExGetCurrentProcessorCpuUsage(pCpuUsage
);
502 NdisGetSharedDataAlignment(VOID
)
504 NDIS_DbgPrint(MAX_TRACE
, ("Called.\n"));
506 return KeGetRecommendedSharedDataAlignment();
516 NDIS_DbgPrint(MAX_TRACE
, ("Called.\n"));
526 NdisGeneratePartialCancelId(VOID
)
528 UCHAR PartialCancelId
;
530 PartialCancelId
= (UCHAR
)InterlockedIncrement(&CancelId
);
532 NDIS_DbgPrint(MAX_TRACE
, ("Cancel ID %u\n", PartialCancelId
));
534 return PartialCancelId
;