Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenroutines.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
1.7.6.1
|