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

routines.c
Go to the documentation of this file.
00001 #include "precomp.h"
00002 
00003 NDIS_HANDLE    GlobalPacketPool = NULL;
00004 NDIS_HANDLE    GlobalBufferPool = NULL;
00005 
00006 NDIS_STATUS InitNdisPools() {
00007     NDIS_STATUS NdisStatus;
00008     /* Last argument is extra space size */
00009     NdisAllocatePacketPool( &NdisStatus, &GlobalPacketPool, 100, 0 );
00010     if( !NT_SUCCESS(NdisStatus) ) return NdisStatus;
00011 
00012     NdisAllocateBufferPool( &NdisStatus, &GlobalBufferPool, 100 );
00013     if( !NT_SUCCESS(NdisStatus) )
00014     NdisFreePacketPool(GlobalPacketPool);
00015 
00016     return NdisStatus;
00017 }
00018 
00019 VOID CloseNdisPools() {
00020     if( GlobalPacketPool ) NdisFreePacketPool( GlobalPacketPool );
00021     if( GlobalBufferPool ) NdisFreeBufferPool( GlobalBufferPool );
00022 }
00023 
00024 __inline INT SkipToOffset(
00025     PNDIS_BUFFER Buffer,
00026     UINT Offset,
00027     PCHAR *Data,
00028     PUINT Size)
00029 /*
00030  * FUNCTION: Skip Offset bytes into a buffer chain
00031  * ARGUMENTS:
00032  *     Buffer = Pointer to NDIS buffer
00033  *     Offset = Number of bytes to skip
00034  *     Data   = Address of a pointer that on return will contain the
00035  *              address of the offset in the buffer
00036  *     Size   = Address of a pointer that on return will contain the
00037  *              size of the destination buffer
00038  * RETURNS:
00039  *     Offset into buffer, -1 if buffer chain was smaller than Offset bytes
00040  * NOTES:
00041  *     Buffer may be NULL
00042  */
00043 {
00044     for (;;) {
00045 
00046         if (!Buffer)
00047             return -1;
00048 
00049         NdisQueryBuffer(Buffer, (PVOID)Data, Size);
00050 
00051         if (Offset < *Size) {
00052             *Data = (PCHAR)((ULONG_PTR) *Data + Offset);
00053             *Size              -= Offset;
00054             break;
00055         }
00056 
00057         Offset -= *Size;
00058 
00059         NdisGetNextBuffer(Buffer, &Buffer);
00060     }
00061 
00062     return Offset;
00063 }
00064 
00065 void GetDataPtr( PNDIS_PACKET Packet,
00066          UINT Offset,
00067          PCHAR *DataOut,
00068          PUINT Size ) {
00069     PNDIS_BUFFER Buffer;
00070 
00071     NdisQueryPacket(Packet, NULL, NULL, &Buffer, NULL);
00072     if( !Buffer ) return;
00073     SkipToOffset( Buffer, Offset, DataOut, Size );
00074 }
00075 
00076 
00077 #undef NdisAllocatePacket
00078 #undef NdisAllocateBuffer
00079 #undef NdisFreeBuffer
00080 #undef NdisFreePacket
00081 
00082 NDIS_STATUS AllocatePacketWithBufferX( PNDIS_PACKET *NdisPacket,
00083                        PCHAR Data, UINT Len,
00084                        PCHAR File, UINT Line ) {
00085     PNDIS_PACKET Packet;
00086     PNDIS_BUFFER Buffer;
00087     NDIS_STATUS Status;
00088     PCHAR NewData;
00089 
00090     NewData = exAllocatePool( NonPagedPool, Len );
00091     if( !NewData ) return NDIS_STATUS_NOT_ACCEPTED; // XXX
00092 
00093     if( Data )
00094     RtlCopyMemory(NewData, Data, Len);
00095 
00096     NdisAllocatePacket( &Status, &Packet, GlobalPacketPool );
00097     if( Status != NDIS_STATUS_SUCCESS ) {
00098     exFreePool( NewData );
00099     return Status;
00100     }
00101     TrackWithTag(NDIS_PACKET_TAG, Packet, File, Line);
00102 
00103     NdisAllocateBuffer( &Status, &Buffer, GlobalBufferPool, NewData, Len );
00104     if( Status != NDIS_STATUS_SUCCESS ) {
00105     exFreePool( NewData );
00106     FreeNdisPacket( Packet );
00107     }
00108     TrackWithTag(NDIS_BUFFER_TAG, Buffer, File, Line);
00109 
00110     NdisChainBufferAtFront( Packet, Buffer );
00111     *NdisPacket = Packet;
00112 
00113     return NDIS_STATUS_SUCCESS;
00114 }
00115 
00116 
00117 VOID FreeNdisPacketX
00118 ( PNDIS_PACKET Packet,
00119   PCHAR File,
00120   UINT Line )
00121 /*
00122  * FUNCTION: Frees an NDIS packet
00123  * ARGUMENTS:
00124  *     Packet = Pointer to NDIS packet to be freed
00125  */
00126 {
00127     PNDIS_BUFFER Buffer, NextBuffer;
00128 
00129     LA_DbgPrint(DEBUG_PBUFFER, ("Packet (0x%X)\n", Packet));
00130 
00131     /* Free all the buffers in the packet first */
00132     NdisQueryPacket(Packet, NULL, NULL, &Buffer, NULL);
00133     for (; Buffer != NULL; Buffer = NextBuffer) {
00134         PVOID Data;
00135         UINT Length;
00136 
00137         NdisGetNextBuffer(Buffer, &NextBuffer);
00138         NdisQueryBuffer(Buffer, &Data, &Length);
00139         NdisFreeBuffer(Buffer);
00140     UntrackFL(File,Line,Buffer);
00141         exFreePool(Data);
00142     }
00143 
00144     /* Finally free the NDIS packet discriptor */
00145     NdisFreePacket(Packet);
00146     UntrackFL(File,Line,Packet);
00147 }

Generated on Sat May 26 2012 04:26:38 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.