Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenmisc.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS NDIS library 00004 * FILE: ndis/misc.c 00005 */ 00006 00007 #include "ndissys.h" 00008 00009 extern LONG CancelId; 00010 00011 /* 00012 * @implemented 00013 */ 00014 #undef NdisInterlockedAddUlong 00015 VOID 00016 EXPORT 00017 NdisInterlockedAddUlong ( 00018 IN PULONG Addend, 00019 IN ULONG Increment, 00020 IN PNDIS_SPIN_LOCK SpinLock) 00021 { 00022 ExInterlockedAddUlong ( Addend, Increment, &SpinLock->SpinLock ); 00023 } 00024 00025 /* 00026 * @implemented 00027 */ 00028 VOID 00029 EXPORT 00030 NdisInterlockedAddLargeInteger( 00031 IN PLARGE_INTEGER Addend, 00032 IN LARGE_INTEGER Increment, 00033 IN PNDIS_SPIN_LOCK SpinLock) 00034 { 00035 /* This needs to be verified. The documentation 00036 * seems to be missing but it is exported by 00037 * NDIS 5.1 so I'm implementing it like the other 00038 * interlocked routines 00039 */ 00040 00041 ExInterlockedAddLargeInteger(Addend, Increment, &SpinLock->SpinLock); 00042 } 00043 00044 /* 00045 * @implemented 00046 */ 00047 LONG 00048 EXPORT 00049 NdisCompareAnsiString( 00050 IN PNDIS_ANSI_STRING String1, 00051 IN PNDIS_ANSI_STRING String2, 00052 BOOLEAN CaseInSensitive) 00053 { 00054 /* This one needs to be verified also. See the 00055 * comment in NdisInterlockedAddLargeInteger 00056 */ 00057 00058 return RtlCompareString(String1, String2, CaseInSensitive); 00059 } 00060 00061 /* 00062 * @implemented 00063 */ 00064 LONG 00065 EXPORT 00066 NdisCompareUnicodeString( 00067 IN PNDIS_STRING String1, 00068 IN PNDIS_STRING String2, 00069 IN BOOLEAN CaseInSensitive) 00070 { 00071 /* This one needs to be verified also. See the 00072 * comment in NdisInterlockedAddLargeInteger 00073 */ 00074 00075 return RtlCompareUnicodeString(String1, String2, CaseInSensitive); 00076 } 00077 00078 /* 00079 * @implemented 00080 */ 00081 #undef NdisInterlockedInsertHeadList 00082 PLIST_ENTRY 00083 EXPORT 00084 NdisInterlockedInsertHeadList( 00085 IN PLIST_ENTRY ListHead, 00086 IN PLIST_ENTRY ListEntry, 00087 IN PNDIS_SPIN_LOCK SpinLock) 00088 { 00089 return ExInterlockedInsertHeadList ( ListHead, ListEntry, &SpinLock->SpinLock ); 00090 } 00091 00092 /* 00093 * @implemented 00094 */ 00095 #undef NdisInterlockedInsertTailList 00096 PLIST_ENTRY 00097 EXPORT 00098 NdisInterlockedInsertTailList( 00099 IN PLIST_ENTRY ListHead, 00100 IN PLIST_ENTRY ListEntry, 00101 IN PNDIS_SPIN_LOCK SpinLock) 00102 { 00103 return ExInterlockedInsertTailList ( ListHead, ListEntry, &SpinLock->SpinLock ); 00104 } 00105 00106 00107 /* 00108 * @implemented 00109 */ 00110 #undef NdisInterlockedRemoveHeadList 00111 PLIST_ENTRY 00112 EXPORT 00113 NdisInterlockedRemoveHeadList( 00114 IN PLIST_ENTRY ListHead, 00115 IN PNDIS_SPIN_LOCK SpinLock) 00116 { 00117 return ExInterlockedRemoveHeadList ( ListHead, &SpinLock->SpinLock ); 00118 } 00119 00120 typedef struct _NDIS_HANDLE_OBJECT 00121 { 00122 HANDLE FileHandle; 00123 BOOLEAN Mapped; 00124 ULONG FileLength; 00125 PVOID MapBuffer; 00126 } NDIS_HANDLE_OBJECT, *PNDIS_HANDLE_OBJECT; 00127 00128 __inline 00129 PNDIS_HANDLE_OBJECT 00130 NDIS_HANDLE_TO_POBJECT ( NDIS_HANDLE handle ) 00131 { 00132 return (PNDIS_HANDLE_OBJECT)handle; 00133 } 00134 00135 __inline 00136 NDIS_HANDLE 00137 NDIS_POBJECT_TO_HANDLE ( PNDIS_HANDLE_OBJECT obj ) 00138 { 00139 return (NDIS_HANDLE)obj; 00140 } 00141 00142 const WCHAR* NDIS_FILE_FOLDER = L"\\SystemRoot\\System32\\Drivers\\"; 00143 00144 /* 00145 * @implemented 00146 */ 00147 VOID 00148 EXPORT 00149 NdisMapFile( 00150 OUT PNDIS_STATUS Status, 00151 OUT PVOID *MappedBuffer, 00152 IN NDIS_HANDLE FileHandle) 00153 { 00154 PNDIS_HANDLE_OBJECT HandleObject = (PNDIS_HANDLE_OBJECT) FileHandle; 00155 00156 NDIS_DbgPrint(MAX_TRACE, ("called: FileHandle 0x%x\n", FileHandle)); 00157 00158 if (HandleObject->Mapped) 00159 { 00160 /* If a file already mapped we will return an error code */ 00161 NDIS_DbgPrint(MIN_TRACE, ("File already mapped\n")); 00162 *Status = NDIS_STATUS_ALREADY_MAPPED; 00163 return; 00164 } 00165 00166 HandleObject->Mapped = TRUE; 00167 *MappedBuffer = HandleObject->MapBuffer; 00168 00169 /* Set returned status */ 00170 *Status = STATUS_SUCCESS; 00171 } 00172 00173 /* 00174 * @implemented 00175 */ 00176 VOID 00177 EXPORT 00178 NdisUnmapFile( 00179 IN NDIS_HANDLE FileHandle) 00180 { 00181 PNDIS_HANDLE_OBJECT HandleObject = (PNDIS_HANDLE_OBJECT) FileHandle; 00182 00183 NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); 00184 00185 HandleObject->Mapped = FALSE; 00186 } 00187 00188 /* 00189 * @implemented 00190 */ 00191 VOID 00192 EXPORT 00193 NdisCloseFile( 00194 IN NDIS_HANDLE FileHandle) 00195 { 00196 PNDIS_HANDLE_OBJECT FileHandleObject; 00197 00198 ASSERT_IRQL(PASSIVE_LEVEL); 00199 00200 NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); 00201 00202 ASSERT ( FileHandle ); 00203 00204 FileHandleObject = NDIS_HANDLE_TO_POBJECT(FileHandle); 00205 00206 ASSERT ( FileHandleObject->FileHandle ); 00207 00208 if ( FileHandleObject->Mapped ) 00209 NdisUnmapFile ( FileHandle ); 00210 00211 ZwClose ( FileHandleObject->FileHandle ); 00212 00213 memset ( FileHandleObject, 0, sizeof(NDIS_HANDLE_OBJECT) ); 00214 00215 ExFreePool ( FileHandleObject ); 00216 } 00217 00218 00219 /* 00220 * @implemented 00221 */ 00222 VOID 00223 EXPORT 00224 NdisOpenFile( 00225 OUT PNDIS_STATUS Status, 00226 OUT PNDIS_HANDLE FileHandle, 00227 OUT PUINT FileLength, 00228 IN PNDIS_STRING FileName, 00229 IN NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress) 00230 { 00231 NDIS_STRING FullFileName; 00232 OBJECT_ATTRIBUTES ObjectAttributes; 00233 PNDIS_HANDLE_OBJECT FileHandleObject = NULL; 00234 IO_STATUS_BLOCK IoStatusBlock; 00235 00236 ASSERT_IRQL(PASSIVE_LEVEL); 00237 00238 NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); 00239 00240 ASSERT ( Status && FileName ); 00241 00242 *Status = NDIS_STATUS_SUCCESS; 00243 FullFileName.Buffer = NULL; 00244 00245 FullFileName.Length = sizeof(NDIS_FILE_FOLDER); 00246 FullFileName.MaximumLength = FileName->MaximumLength + sizeof(NDIS_FILE_FOLDER); 00247 FullFileName.Buffer = ExAllocatePool ( NonPagedPool, FullFileName.MaximumLength ); 00248 00249 if ( !FullFileName.Buffer ) 00250 { 00251 NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources\n")); 00252 *Status = NDIS_STATUS_RESOURCES; 00253 goto cleanup; 00254 } 00255 00256 FileHandleObject = ExAllocatePool ( NonPagedPool, sizeof(NDIS_HANDLE_OBJECT) ); 00257 if ( !FileHandleObject ) 00258 { 00259 NDIS_DbgPrint(MIN_TRACE, ("Insufficient resources\n")); 00260 *Status = NDIS_STATUS_RESOURCES; 00261 goto cleanup; 00262 } 00263 memset ( FileHandleObject, 0, sizeof(NDIS_HANDLE_OBJECT) ); 00264 00265 memmove ( FullFileName.Buffer, NDIS_FILE_FOLDER, FullFileName.Length ); 00266 *Status = RtlAppendUnicodeStringToString ( &FullFileName, FileName ); 00267 if ( !NT_SUCCESS(*Status) ) 00268 { 00269 NDIS_DbgPrint(MIN_TRACE, ("RtlAppendUnicodeStringToString failed (%x)\n", *Status)); 00270 *Status = NDIS_STATUS_FAILURE; 00271 goto cleanup; 00272 } 00273 00274 InitializeObjectAttributes ( &ObjectAttributes, 00275 &FullFileName, 00276 OBJ_CASE_INSENSITIVE, 00277 NULL, 00278 NULL ); 00279 00280 *Status = ZwCreateFile ( 00281 &FileHandleObject->FileHandle, 00282 FILE_READ_DATA|SYNCHRONIZE, 00283 &ObjectAttributes, 00284 &IoStatusBlock, 00285 NULL, // PLARGE_INTEGER AllocationSize 00286 0, // ULONG FileAttributes 00287 FILE_SHARE_READ, // ULONG ShareAccess 00288 FILE_CREATE, // ULONG CreateDisposition 00289 FILE_SYNCHRONOUS_IO_NONALERT, // ULONG CreateOptions 00290 0, // PVOID EaBuffer 00291 0 ); // ULONG EaLength 00292 00293 if ( !NT_SUCCESS(*Status) ) 00294 { 00295 NDIS_DbgPrint(MIN_TRACE, ("ZwCreateFile failed (%x)\n", *Status)); 00296 *Status = NDIS_STATUS_FAILURE; 00297 } 00298 00299 cleanup: 00300 if ( FullFileName.Buffer != NULL ) 00301 { 00302 ExFreePool ( FullFileName.Buffer ); 00303 FullFileName.Buffer = NULL; 00304 } 00305 if ( !NT_SUCCESS(*Status) ) 00306 { 00307 if( FileHandleObject ) { 00308 ExFreePool ( FileHandleObject ); 00309 FileHandleObject = NULL; 00310 } 00311 *FileHandle = NULL; 00312 } 00313 else 00314 *FileHandle = NDIS_POBJECT_TO_HANDLE(FileHandleObject); 00315 00316 return; 00317 } 00318 00319 /* 00320 * @implemented 00321 */ 00322 CCHAR 00323 EXPORT 00324 NdisSystemProcessorCount( 00325 VOID) 00326 { 00327 return (CCHAR)KeNumberProcessors; 00328 } 00329 00330 00331 /* 00332 * @implemented 00333 */ 00334 VOID 00335 EXPORT 00336 NdisGetCurrentProcessorCounts( 00337 OUT PULONG pIdleCount, 00338 OUT PULONG pKernelAndUser, 00339 OUT PULONG pIndex) 00340 /* 00341 * FUNCTION: 00342 * ARGUMENTS: 00343 * NOTES: 00344 * NDIS 5.0 00345 */ 00346 { 00347 NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); 00348 00349 ExGetCurrentProcessorCounts( (PULONG) pIdleCount, (PULONG) pKernelAndUser, (PULONG) pIndex); 00350 } 00351 00352 00353 /* 00354 * @implemented 00355 */ 00356 VOID 00357 EXPORT 00358 NdisGetSystemUpTime(OUT PULONG pSystemUpTime) 00359 { 00360 ULONG Increment; 00361 LARGE_INTEGER TickCount; 00362 00363 NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); 00364 00365 /* Get the increment and current tick count */ 00366 Increment = KeQueryTimeIncrement(); 00367 KeQueryTickCount(&TickCount); 00368 00369 /* Convert to milliseconds and return */ 00370 TickCount.QuadPart *= Increment; 00371 TickCount.QuadPart /= (10 * 1000); 00372 *pSystemUpTime = TickCount.LowPart; 00373 } 00374 00375 /* 00376 * @implemented 00377 */ 00378 #undef NdisInterlockedDecrement 00379 LONG 00380 EXPORT 00381 NdisInterlockedDecrement( 00382 IN PLONG Addend) 00383 /* 00384 * FUNCTION: 00385 * ARGUMENTS: 00386 * NOTES: 00387 * NDIS 5.0 00388 */ 00389 { 00390 return InterlockedDecrement ( Addend ); 00391 } 00392 00393 00394 /* 00395 * @implemented 00396 */ 00397 #undef NdisInterlockedIncrement 00398 LONG 00399 EXPORT 00400 NdisInterlockedIncrement( 00401 IN PLONG Addend) 00402 /* 00403 * FUNCTION: 00404 * ARGUMENTS: 00405 * NOTES: 00406 * NDIS 5.0 00407 */ 00408 { 00409 return InterlockedIncrement ( Addend ); 00410 } 00411 00412 00413 /* 00414 * @implemented 00415 */ 00416 #undef NdisInterlockedPopEntrySList 00417 PSINGLE_LIST_ENTRY 00418 EXPORT 00419 NdisInterlockedPopEntrySList( 00420 IN PSLIST_HEADER ListHead, 00421 IN PKSPIN_LOCK Lock) 00422 /* 00423 * FUNCTION: 00424 * ARGUMENTS: 00425 * NOTES: 00426 * NDIS 5.0 00427 */ 00428 { 00429 return (PSINGLE_LIST_ENTRY)ExInterlockedPopEntrySList ( ListHead, Lock ); 00430 } 00431 00432 00433 /* 00434 * @implemented 00435 */ 00436 #undef NdisInterlockedPushEntrySList 00437 PSINGLE_LIST_ENTRY 00438 EXPORT 00439 NdisInterlockedPushEntrySList( 00440 IN PSLIST_HEADER ListHead, 00441 IN PSINGLE_LIST_ENTRY ListEntry, 00442 IN PKSPIN_LOCK Lock) 00443 /* 00444 * FUNCTION: 00445 * ARGUMENTS: 00446 * NOTES: 00447 * NDIS 5.0 00448 */ 00449 { 00450 return (PSINGLE_LIST_ENTRY)ExInterlockedPushEntrySList ( ListHead, (PSLIST_ENTRY)ListEntry, Lock ); 00451 } 00452 00453 00454 VOID 00455 NTAPI 00456 ndisProcWorkItemHandler(PVOID pContext) 00457 { 00458 PNDIS_WORK_ITEM pNdisItem = (PNDIS_WORK_ITEM)pContext; 00459 00460 NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); 00461 00462 pNdisItem->Routine(pNdisItem, pNdisItem->Context); 00463 } 00464 00465 NDIS_STATUS 00466 EXPORT 00467 NdisScheduleWorkItem( 00468 IN PNDIS_WORK_ITEM pWorkItem) 00469 { 00470 PWORK_QUEUE_ITEM pntWorkItem = (PWORK_QUEUE_ITEM)pWorkItem->WrapperReserved; 00471 00472 NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); 00473 00474 ExInitializeWorkItem(pntWorkItem, ndisProcWorkItemHandler, pWorkItem); 00475 ExQueueWorkItem(pntWorkItem, DelayedWorkQueue); 00476 return NDIS_STATUS_SUCCESS; 00477 } 00478 00479 /* 00480 * @implemented 00481 */ 00482 VOID 00483 EXPORT 00484 NdisGetCurrentProcessorCpuUsage( 00485 PULONG pCpuUsage) 00486 /* 00487 * FUNCTION: Returns how busy the current processor is as a percentage 00488 * ARGUMENTS: 00489 * pCpuUsage = Pointer to a buffer to place CPU usage 00490 */ 00491 { 00492 NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); 00493 00494 ExGetCurrentProcessorCpuUsage(pCpuUsage); 00495 } 00496 00497 /* 00498 * @implemented 00499 */ 00500 ULONG 00501 EXPORT 00502 NdisGetSharedDataAlignment(VOID) 00503 { 00504 NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); 00505 00506 return KeGetRecommendedSharedDataAlignment(); 00507 } 00508 00509 /* 00510 * @implemented 00511 */ 00512 UINT 00513 EXPORT 00514 NdisGetVersion(VOID) 00515 { 00516 NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); 00517 00518 return NDIS_VERSION; 00519 } 00520 00521 /* 00522 * @implemented 00523 */ 00524 UCHAR 00525 EXPORT 00526 NdisGeneratePartialCancelId(VOID) 00527 { 00528 UCHAR PartialCancelId; 00529 00530 PartialCancelId = (UCHAR)InterlockedIncrement(&CancelId); 00531 00532 NDIS_DbgPrint(MAX_TRACE, ("Cancel ID %u\n", PartialCancelId)); 00533 00534 return PartialCancelId; 00535 } 00536 00537 /* EOF */ Generated on Sun May 27 2012 04:16:54 for ReactOS by
1.7.6.1
|