ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

misc.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.