|
|
1.1 ! root 1: /*++ BUILD Version: 0002 // Increment this if a change has global effects ! 2: ! 3: Copyright (c) 1992 Microsoft Corporation ! 4: ! 5: Module Name: ! 6: ! 7: ndis.h ! 8: ! 9: Abstract: ! 10: ! 11: Main header file for the wrapper ! 12: ! 13: Author: ! 14: ! 15: Adam Barr (adamba) 26-Jul-1990 ! 16: Johnson R Apacible (JohnsonA) 10-Jul-1991 ! 17: ! 18: Revision History: ! 19: ! 20: 26-Feb-1991 JohnsonA Debug version of wrapper ! 21: 10-Jul-1991 JohnsonA Implement revised NDIS 3.0 specification ! 22: 01-Nov-1991 SeanSe Correct and Expand NDIS 3.1 specification ! 23: ! 24: --*/ ! 25: ! 26: ! 27: #ifndef _NDIS_ ! 28: #define _NDIS_ ! 29: ! 30: ! 31: #define NDIS_NT 1 ! 32: ! 33: #include <ntddk.h> ! 34: #include <netevent.h> ! 35: ! 36: ! 37: #ifndef _WINDEF_ // these are defined in windows.h too ! 38: typedef signed int INT, *PINT; ! 39: typedef unsigned int UINT, *PUINT; ! 40: #endif ! 41: typedef UNICODE_STRING NDIS_STRING, *PNDIS_STRING; ! 42: ! 43: ! 44: // ! 45: // This file contains the definition of an NDIS_OID as ! 46: // well as #defines for all the current OID values. ! 47: // ! 48: ! 49: #include <ntddndis.h> ! 50: ! 51: ! 52: #ifdef NDIS_DOS ! 53: #undef NDIS_DOS ! 54: #endif ! 55: ! 56: #ifdef IF_ERROR_CHK ! 57: #undef IF_ERROR_CHK ! 58: #endif ! 59: ! 60: #ifdef NDISDBG ! 61: #ifdef MEMPRINT ! 62: #include "memprint.h" //DavidTr's memprint program at ntos\srv ! 63: #endif // MEMPRINT ! 64: ! 65: extern int NdisMsgLevel; ! 66: extern BOOLEAN NdisChkErrorFlag; ! 67: extern ULONG PendingSends; ! 68: ! 69: #define TRACE_NONE 0x0000 ! 70: #define TRACE_IMPT 0x0001 ! 71: #define TRACE_ALL 0x0002 ! 72: ! 73: #define IF_TRACE(level) if ( NdisMsgLevel >= (level) ) //for tracing ! 74: ! 75: #define IF_ERROR_CHK if (NdisChkErrorFlag) // for parameter checking ! 76: ! 77: #define DbgIsMdl(_Buffer) \ ! 78: ( ((ULONG)(_Buffer)->Size) == MmSizeOfMdl(MmGetMdlVirtualAddress(_Buffer), \ ! 79: MmGetMdlByteCount(_Buffer)) ) ! 80: ! 81: #define DbgIsNonPaged(_Address) \ ! 82: ( MmIsNonPagedSystemAddressValid((PVOID)(_Address)) ) ! 83: ! 84: #define DbgIsPacket(_Packet) \ ! 85: ( ((_Packet)->Private.Pool->PacketLength) > sizeof(_Packet) ) ! 86: ! 87: #define DbgIsNull(_Ptr) ( ((PVOID)(_Ptr)) == NULL ) ! 88: ! 89: #define NdisPrint1(fmt) DbgPrint(fmt) ! 90: #define NdisPrint2(fmt,v1) DbgPrint(fmt,v1) ! 91: #define NdisPrint3(fmt,v1,v2) DbgPrint(fmt,v1,v2) ! 92: #define NdisPrint4(fmt,v1,v2,v3) DbgPrint(fmt,v1,v2,v3) ! 93: #define NdisPrint5(fmt,v1,v2,v3,v4) DbgPrint(fmt,v1,v2,v3,v4) ! 94: ! 95: #else // NDISDBG ! 96: #define IF_TRACE(level) if (FALSE) ! 97: #define IF_ERROR_CHK if (FALSE) ! 98: #define DbgIsMdl(_Buffer) TRUE ! 99: #define DbgIsNonPaged(_Address) TRUE ! 100: #define DbgIsPacket(_Packet) TRUE ! 101: #define DbgIsNull(_Ptr) FALSE ! 102: ! 103: #define NdisPrint1(fmt) ! 104: #define NdisPrint2(fmt,v1) ! 105: #define NdisPrint3(fmt,v1,v2) ! 106: #define NdisPrint4(fmt,v1,v2,v3) ! 107: #define NdisPrint5(fmt,v1,v2,v3,v4) ! 108: #endif // NDISDBG ! 109: ! 110: // ! 111: // Ndis defines for configuration manager data structures ! 112: // ! 113: ! 114: typedef CM_MCA_POS_DATA NDIS_MCA_POS_DATA, *PNDIS_MCA_POS_DATA; ! 115: typedef CM_EISA_SLOT_INFORMATION NDIS_EISA_SLOT_INFORMATION; ! 116: typedef CM_EISA_SLOT_INFORMATION *PNDIS_EISA_SLOT_INFORMATION; ! 117: typedef CM_EISA_FUNCTION_INFORMATION NDIS_EISA_FUNCTION_INFORMATION; ! 118: typedef CM_EISA_FUNCTION_INFORMATION *PNDIS_EISA_FUNCTION_INFORMATION; ! 119: ! 120: // ! 121: // ! 122: // Ndis defines and data structures ! 123: // ! 124: // ! 125: ! 126: ! 127: // ! 128: // Ndis macros that are supplied to Device Drivers to help ! 129: // with portability. They are not published in the NT spec ! 130: // as yet. For now you should supply two versions of each ! 131: // macros - an NT specific one and a portable one. ! 132: // ! 133: ! 134: #if NDIS_NT ! 135: ! 136: // ! 137: // ZZZ These macros are peculiar to NT. ! 138: // ! 139: ! 140: #define NdisMoveMemory(Destination,Source,Length) RtlCopyMemory(Destination,Source,Length) ! 141: #define NdisZeroMemory(Destination,Length) RtlZeroMemory(Destination,Length) ! 142: #define NdisRetrieveUlong(Destination,Source) RtlRetrieveUlong(Destination,Source) ! 143: #define NdisStoreUlong(Destination,Value) RtlStoreUlong(Destination,Value) ! 144: #define NDIS_STRING_CONST(x) {sizeof(L##x)-2, sizeof(L##x), L##x} ! 145: ! 146: // ! 147: // On a MIPS machine, I/O mapped memory can't be accessed with ! 148: // the Rtl routines. ! 149: // ! 150: ! 151: #ifdef _M_IX86 ! 152: #define NdisMoveMappedMemory(Destination,Source,Length) RtlCopyMemory(Destination,Source,Length) ! 153: #define NdisZeroMappedMemory(Destination,Length) RtlZeroMemory(Destination,Length) ! 154: #elif defined(_M_MRX000) || defined(_MIPS_) ! 155: #define NdisMoveMappedMemory(Destination,Source,Length) \ ! 156: { \ ! 157: PUCHAR _Src = (Source); \ ! 158: PUCHAR _Dest = (Destination); \ ! 159: PUCHAR _End = _Dest + (Length); \ ! 160: while (_Dest < _End) { \ ! 161: *_Dest++ = *_Src++; \ ! 162: } \ ! 163: } ! 164: #define NdisZeroMappedMemory(Destination,Length) \ ! 165: { \ ! 166: PUCHAR _Dest = (Destination); \ ! 167: PUCHAR _End = _Dest + (Length); \ ! 168: while (_Dest < _End) { \ ! 169: *_Dest++ = 0; \ ! 170: } \ ! 171: } ! 172: #elif defined(_ALPHA_) ! 173: ! 174: #define NdisMoveMappedMemory(Destination,Source,Length) \ ! 175: { \ ! 176: PUCHAR _Src = (Source); \ ! 177: PUCHAR _Dest = (Destination); \ ! 178: PUCHAR _End = _Dest + (Length); \ ! 179: while (_Dest < _End) { \ ! 180: *_Dest++ = *_Src++; \ ! 181: } \ ! 182: } ! 183: #define NdisZeroMappedMemory(Destination,Length) \ ! 184: { \ ! 185: PUCHAR _Dest = (Destination); \ ! 186: PUCHAR _End = _Dest + (Length); \ ! 187: while (_Dest < _End) { \ ! 188: NdisWriteRegisterUchar(_Dest,0); \ ! 189: _Dest++; \ ! 190: } \ ! 191: } ! 192: ! 193: #endif ! 194: ! 195: ! 196: #else ! 197: ! 198: // ! 199: // These macros MUST be portable. ! 200: // ! 201: ! 202: #define NdisMoveMemory(Destination,Source,Length) memcpy(Destination,Source,Length) ! 203: #define NdisZeroMemory(Destination,Length) memset(Destination,'\0',Length) ! 204: #define NdisMoveMappedMemory(Destination,Source,Length) memcpy(Destination,Source,Length) ! 205: #define NdisZeroMappedMemory(Destination,Length) memset(Destination,'\0',Length) ! 206: #define NdisRetrieveUlong(Destination,Source)\ ! 207: {\ ! 208: UCHAR _S = 0;\ ! 209: for (; _S < sizeof(ULONG) ; _S++ ) {\ ! 210: ((PUCHAR)Destination)[_S] = ((PUCHAR)Source)[_S];\ ! 211: }\ ! 212: } ! 213: #define NdisStoreUlong(Destination,Value)\ ! 214: {\ ! 215: UCHAR _S = 0;\ ! 216: for (; _S < sizeof(ULONG) ; _S++ ) {\ ! 217: ((PUCHAR)Destination)[_S] = ((UCHAR)(Value >> (_S * 8)));\ ! 218: }\ ! 219: } ! 220: ! 221: ! 222: #endif ! 223: ! 224: ! 225: // ! 226: // On Mips and Intel systems, these are the same. On Alpha, they are different. ! 227: // ! 228: ! 229: #ifdef _ALPHA_ ! 230: ! 231: #define NdisMoveToMappedMemory(Destination,Source,Length) WRITE_REGISTER_BUFFER_UCHAR(Destination,Source,Length) ! 232: #define NdisMoveFromMappedMemory(Destination,Source,Length) READ_REGISTER_BUFFER_UCHAR(Source,Destination,Length) ! 233: ! 234: #else ! 235: ! 236: #define NdisMoveToMappedMemory(Destination,Source,Length) NdisMoveMappedMemory(Destination,Source,Length) ! 237: #define NdisMoveFromMappedMemory(Destination,Source,Length) NdisMoveMappedMemory(Destination,Source,Length) ! 238: ! 239: #endif ! 240: ! 241: ! 242: ! 243: // ! 244: // This macro is used to determine how many physical pieces ! 245: // an NDIS_BUFFER will take up when mapped. ! 246: // ! 247: ! 248: #define NDIS_BUFFER_TO_SPAN_PAGES(_Buffer) \ ! 249: (ADDRESS_AND_SIZE_TO_SPAN_PAGES(\ ! 250: MmGetMdlVirtualAddress(_Buffer), \ ! 251: MmGetMdlByteCount(_Buffer))) ! 252: ! 253: ! 254: // ! 255: // definition of the basic spin lock structure ! 256: // ! 257: ! 258: typedef struct _NDIS_SPIN_LOCK { ! 259: KSPIN_LOCK SpinLock; ! 260: KIRQL OldIrql; ! 261: } NDIS_SPIN_LOCK, * PNDIS_SPIN_LOCK; ! 262: ! 263: ! 264: typedef PVOID NDIS_HANDLE, *PNDIS_HANDLE; ! 265: ! 266: typedef int NDIS_STATUS, *PNDIS_STATUS; // note default size ! 267: ! 268: typedef struct _NDIS_TIMER { ! 269: KTIMER Timer; ! 270: KDPC Dpc; ! 271: } NDIS_TIMER, *PNDIS_TIMER; ! 272: ! 273: ! 274: #define NdisInterruptLatched Latched ! 275: #define NdisInterruptLevelSensitive LevelSensitive ! 276: typedef KINTERRUPT_MODE NDIS_INTERRUPT_MODE, *PNDIS_INTERRUPT_MODE; ! 277: ! 278: ! 279: typedef ! 280: BOOLEAN ! 281: (*PNDIS_INTERRUPT_SERVICE) ( ! 282: IN PVOID InterruptContext ! 283: ); ! 284: ! 285: typedef ! 286: VOID ! 287: (*PNDIS_DEFERRED_PROCESSING) ( ! 288: IN PVOID SystemSpecific1, ! 289: IN PVOID InterruptContext, ! 290: IN PVOID SystemSpecific2, ! 291: IN PVOID SystemSpecific3 ! 292: ); ! 293: ! 294: ! 295: typedef struct _NDIS_INTERRUPT { ! 296: PKINTERRUPT InterruptObject; ! 297: KSPIN_LOCK DpcCountLock; ! 298: PNDIS_INTERRUPT_SERVICE MacIsr; // Pointer to Mac ISR routine ! 299: PNDIS_DEFERRED_PROCESSING MacDpc; // Pointer to Mac DPC routine ! 300: KDPC InterruptDpc; ! 301: PVOID InterruptContext; // Pointer to context for calling ! 302: // adapters ISR and DPC. ! 303: UCHAR DpcCount; ! 304: BOOLEAN Removing; // TRUE if removing interrupt ! 305: ! 306: // ! 307: // This is used to tell when all the Dpcs for the adapter are completed. ! 308: // ! 309: KEVENT DpcsCompletedEvent; ! 310: ! 311: } NDIS_INTERRUPT, *PNDIS_INTERRUPT; ! 312: ! 313: struct _NDIS_PACKET; ! 314: ! 315: ! 316: // ! 317: // Configuration definitions ! 318: // ! 319: ! 320: // ! 321: // Possible data types ! 322: // ! 323: typedef enum _NDIS_PARAMETER_TYPE { ! 324: NdisParameterInteger, ! 325: NdisParameterHexInteger, ! 326: NdisParameterString, ! 327: NdisParameterMultiString ! 328: } NDIS_PARAMETER_TYPE, *PNDIS_PARAMETER_TYPE; ! 329: ! 330: // ! 331: // To store configuration information ! 332: // ! 333: typedef struct _NDIS_CONFIGURATION_PARAMETER { ! 334: NDIS_PARAMETER_TYPE ParameterType; ! 335: union { ! 336: ULONG IntegerData; ! 337: NDIS_STRING StringData; ! 338: } ParameterData; ! 339: } NDIS_CONFIGURATION_PARAMETER, *PNDIS_CONFIGURATION_PARAMETER; ! 340: ! 341: ! 342: // ! 343: // Definitions for the "ProcessorType" keyword ! 344: // ! 345: typedef enum _NDIS_PROCESSOR_TYPE { ! 346: NdisProcessorX86, ! 347: NdisProcessorMips, ! 348: NdisProcessorAlpha ! 349: } NDIS_PROCESSOR_TYPE, *PNDIS_PROCESSOR_TYPE; ! 350: ! 351: // ! 352: // Definitions for the "Environment" keyword ! 353: // ! 354: typedef enum _NDIS_ENVIRONMENT_TYPE { ! 355: NdisEnvironmentWindows, ! 356: NdisEnvironmentWindowsNt ! 357: } NDIS_ENVIRONMENT_TYPE, *PNDIS_ENVIRONMENT_TYPE; ! 358: ! 359: ! 360: // ! 361: // Possible Hardware Architecture. Define these to ! 362: // match the HAL INTERFACE_TYPE enum. ! 363: // ! 364: typedef enum _NDIS_INTERFACE_TYPE { ! 365: NdisInterfaceInternal = Internal, ! 366: NdisInterfaceIsa = Isa, ! 367: NdisInterfaceEisa = Eisa, ! 368: NdisInterfaceMca = MicroChannel, ! 369: NdisInterfaceTurboChannel = TurboChannel ! 370: } NDIS_INTERFACE_TYPE, *PNDIS_INTERFACE_TYPE; ! 371: ! 372: ! 373: // ! 374: // The structure passed up on a WAN_LINE_UP indication ! 375: // ! 376: ! 377: typedef struct _NDIS_WAN_LINE_UP { ! 378: ULONG LinkSpeed; // 100 bps units ! 379: ULONG MaximumTotalSize; // suggested max for send packets ! 380: NDIS_WAN_QUALITY Quality; ! 381: USHORT SendWindow; // suggested by the MAC ! 382: UCHAR Address[1]; // variable length, depends on address type ! 383: } NDIS_WAN_LINE_UP, *PNDIS_WAN_LINE_UP; ! 384: ! 385: // ! 386: // The structure passed up on a WAN_LINE_DOWN indication ! 387: // ! 388: ! 389: typedef struct _NDIS_WAN_LINE_DOWN { ! 390: UCHAR Address[1]; // variable length, depends on address type ! 391: } NDIS_WAN_LINE_DOWN, *PNDIS_WAN_LINE_DOWN; ! 392: ! 393: // ! 394: // The structure passed up on a WAN_FRAGMENT indication ! 395: // ! 396: ! 397: typedef struct _NDIS_WAN_FRAGMENT { ! 398: UCHAR Address[1]; // variable length, depends on address type ! 399: } NDIS_WAN_FRAGMENT, *PNDIS_WAN_FRAGMENT; ! 400: ! 401: ! 402: // ! 403: // Ndis Adapter Information ! 404: // ! 405: ! 406: typedef ! 407: NDIS_STATUS ! 408: (*PNDIS_ACTIVATE_CALLBACK) ( ! 409: IN NDIS_HANDLE NdisAdatperHandle, ! 410: IN NDIS_HANDLE MacAdapterContext, ! 411: IN ULONG DmaChannel ! 412: ); ! 413: ! 414: typedef struct _NDIS_PORT_DESCRIPTOR { ! 415: ULONG InitialPort; ! 416: ULONG NumberOfPorts; ! 417: PVOID *PortOffset; ! 418: } NDIS_PORT_DESCRIPTOR, *PNDIS_PORT_DESCRIPTOR; ! 419: ! 420: typedef struct _NDIS_ADAPTER_INFORMATION { ! 421: ULONG DmaChannel; ! 422: BOOLEAN Master; ! 423: BOOLEAN Dma32BitAddresses; ! 424: PNDIS_ACTIVATE_CALLBACK ActivateCallback; ! 425: NDIS_INTERFACE_TYPE AdapterType; ! 426: ULONG PhysicalMapRegistersNeeded; ! 427: ULONG MaximumPhysicalMapping; ! 428: ULONG NumberOfPortDescriptors; ! 429: NDIS_PORT_DESCRIPTOR PortDescriptors[1]; // as many as needed ! 430: } NDIS_ADAPTER_INFORMATION, *PNDIS_ADAPTER_INFORMATION; ! 431: ! 432: // ! 433: // DMA Channel information ! 434: // ! 435: typedef struct _NDIS_DMA_DESCRIPTION { ! 436: BOOLEAN DemandMode; ! 437: BOOLEAN AutoInitialize; ! 438: BOOLEAN DmaChannelSpecified; ! 439: DMA_WIDTH DmaWidth; ! 440: DMA_SPEED DmaSpeed; ! 441: ULONG DmaPort; ! 442: ULONG DmaChannel; ! 443: } NDIS_DMA_DESCRIPTION, *PNDIS_DMA_DESCRIPTION; ! 444: ! 445: // ! 446: // Internal structure representing an NDIS DMA channel ! 447: // ! 448: typedef struct _NDIS_DMA_BLOCK { ! 449: PVOID MapRegisterBase; ! 450: KEVENT AllocationEvent; ! 451: PADAPTER_OBJECT SystemAdapterObject; ! 452: BOOLEAN InProgress; ! 453: } NDIS_DMA_BLOCK, *PNDIS_DMA_BLOCK; ! 454: ! 455: ! 456: // ! 457: // Ndis Buffer is actually an Mdl ! 458: // ! 459: typedef MDL NDIS_BUFFER, * PNDIS_BUFFER; ! 460: ! 461: // ! 462: // packet pool definition ! 463: // ! 464: typedef struct _NDIS_PACKET_POOL { ! 465: NDIS_SPIN_LOCK SpinLock; ! 466: struct _NDIS_PACKET *FreeList; // linked list of free slots in pool ! 467: UINT PacketLength; // amount needed in each packet ! 468: UCHAR Buffer[1]; // actual pool memory ! 469: } NDIS_PACKET_POOL, * PNDIS_PACKET_POOL; ! 470: ! 471: ! 472: // ! 473: // wrapper-specific part of a packet ! 474: // ! 475: ! 476: typedef struct _NDIS_PACKET_PRIVATE { ! 477: UINT PhysicalCount; // number of physical pages in packet. ! 478: UINT TotalLength; // Total amount of data in the packet. ! 479: PNDIS_BUFFER Head; // first buffer in the chain ! 480: PNDIS_BUFFER Tail; // last buffer in the chain ! 481: ! 482: // if Head is NULL the chain is empty; Tail doesn't have to be NULL also ! 483: ! 484: PNDIS_PACKET_POOL Pool; // so we know where to free it back to ! 485: UINT Count; ! 486: ULONG Flags; ! 487: BOOLEAN ValidCounts; ! 488: } NDIS_PACKET_PRIVATE, * PNDIS_PACKET_PRIVATE; ! 489: ! 490: ! 491: // ! 492: // packet definition ! 493: // ! 494: ! 495: typedef struct _NDIS_PACKET { ! 496: NDIS_PACKET_PRIVATE Private; ! 497: UCHAR MacReserved[16]; ! 498: UCHAR ProtocolReserved[1]; ! 499: } NDIS_PACKET, * PNDIS_PACKET; ! 500: ! 501: ! 502: // ! 503: // Request types used by NdisRequest; constants are added for ! 504: // all entry points in the MAC, for those that want to create ! 505: // their own internal requests. ! 506: // ! 507: ! 508: typedef enum _NDIS_REQUEST_TYPE { ! 509: NdisRequestQueryInformation, ! 510: NdisRequestSetInformation, ! 511: NdisRequestQueryStatistics, ! 512: NdisRequestOpen, ! 513: NdisRequestClose, ! 514: NdisRequestSend, ! 515: NdisRequestTransferData, ! 516: NdisRequestReset, ! 517: NdisRequestGeneric1, ! 518: NdisRequestGeneric2, ! 519: NdisRequestGeneric3, ! 520: NdisRequestGeneric4 ! 521: } NDIS_REQUEST_TYPE, *PNDIS_REQUEST_TYPE; ! 522: ! 523: ! 524: // ! 525: // Structure of requests sent via NdisRequest ! 526: // ! 527: ! 528: typedef struct _NDIS_REQUEST { ! 529: UCHAR MacReserved[16]; ! 530: NDIS_REQUEST_TYPE RequestType; ! 531: union _DATA { ! 532: ! 533: struct _QUERY_INFORMATION { ! 534: NDIS_OID Oid; ! 535: PVOID InformationBuffer; ! 536: UINT InformationBufferLength; ! 537: UINT BytesWritten; ! 538: UINT BytesNeeded; ! 539: } QUERY_INFORMATION; ! 540: ! 541: struct _SET_INFORMATION { ! 542: NDIS_OID Oid; ! 543: PVOID InformationBuffer; ! 544: UINT InformationBufferLength; ! 545: UINT BytesRead; ! 546: UINT BytesNeeded; ! 547: } SET_INFORMATION; ! 548: ! 549: } DATA; ! 550: ! 551: } NDIS_REQUEST, *PNDIS_REQUEST; ! 552: ! 553: ! 554: // ! 555: // Definitions for physical address. ! 556: // ! 557: ! 558: typedef PHYSICAL_ADDRESS NDIS_PHYSICAL_ADDRESS, *PNDIS_PHYSICAL_ADDRESS; ! 559: typedef struct _NDIS_PHYSICAL_ADDRESS_UNIT { ! 560: NDIS_PHYSICAL_ADDRESS PhysicalAddress; ! 561: UINT Length; ! 562: } NDIS_PHYSICAL_ADDRESS_UNIT, *PNDIS_PHYSICAL_ADDRESS_UNIT; ! 563: ! 564: ! 565: /*++ ! 566: ! 567: ULONG ! 568: NdisGetPhysicalAddressHigh( ! 569: IN NDIS_PHYSICAL_ADDRESS PhysicalAddress ! 570: ); ! 571: ! 572: --*/ ! 573: ! 574: #define NdisGetPhysicalAddressHigh(_PhysicalAddress)\ ! 575: ((_PhysicalAddress).HighPart) ! 576: ! 577: ! 578: /*++ ! 579: ! 580: VOID ! 581: NdisSetPhysicalAddressHigh( ! 582: IN NDIS_PHYSICAL_ADDRESS PhysicalAddress, ! 583: IN ULONG Value ! 584: ); ! 585: ! 586: --*/ ! 587: ! 588: #define NdisSetPhysicalAddressHigh(_PhysicalAddress, _Value)\ ! 589: ((_PhysicalAddress).HighPart) = (_Value) ! 590: ! 591: ! 592: /*++ ! 593: ! 594: ULONG ! 595: NdisGetPhysicalAddressLow( ! 596: IN NDIS_PHYSICAL_ADDRESS PhysicalAddress ! 597: ); ! 598: ! 599: --*/ ! 600: ! 601: #define NdisGetPhysicalAddressLow(_PhysicalAddress) \ ! 602: ((_PhysicalAddress).LowPart) ! 603: ! 604: ! 605: /*++ ! 606: ! 607: VOID ! 608: NdisSetPhysicalAddressLow( ! 609: IN NDIS_PHYSICAL_ADDRESS PhysicalAddress, ! 610: IN ULONG Value ! 611: ); ! 612: ! 613: --*/ ! 614: ! 615: #define NdisSetPhysicalAddressLow(_PhysicalAddress, _Value) \ ! 616: ((_PhysicalAddress).LowPart) = (_Value) ! 617: ! 618: ! 619: // ! 620: // Macro to initialize an NDIS_PHYSICAL_ADDRESS constant ! 621: // ! 622: ! 623: #define NDIS_PHYSICAL_ADDRESS_CONST(_Low, _High) \ ! 624: { (ULONG)(_Low), (LONG)(_High) } ! 625: ! 626: ! 627: // ! 628: // Include an incomplete type for NDIS_PACKET structure so that ! 629: // function types can refer to a type to be defined later. ! 630: // ! 631: struct _NDIS_PACKET; ! 632: ! 633: // ! 634: // Function types for NDIS_PROTOCOL_CHARACTERISTICS ! 635: // ! 636: // ! 637: ! 638: typedef ! 639: VOID ! 640: (*OPEN_ADAPTER_COMPLETE_HANDLER) ( ! 641: IN NDIS_HANDLE ProtocolBindingContext, ! 642: IN NDIS_STATUS Status, ! 643: IN NDIS_STATUS OpenErrorStatus ! 644: ); ! 645: ! 646: typedef ! 647: VOID ! 648: (*CLOSE_ADAPTER_COMPLETE_HANDLER) ( ! 649: IN NDIS_HANDLE ProtocolBindingContext, ! 650: IN NDIS_STATUS Status ! 651: ); ! 652: ! 653: typedef ! 654: VOID ! 655: (*SEND_COMPLETE_HANDLER) ( ! 656: IN NDIS_HANDLE ProtocolBindingContext, ! 657: IN PNDIS_PACKET Packet, ! 658: IN NDIS_STATUS Status ! 659: ); ! 660: ! 661: typedef ! 662: VOID ! 663: (*TRANSFER_DATA_COMPLETE_HANDLER) ( ! 664: IN NDIS_HANDLE ProtocolBindingContext, ! 665: IN PNDIS_PACKET Packet, ! 666: IN NDIS_STATUS Status, ! 667: IN UINT BytesTransferred ! 668: ); ! 669: ! 670: typedef ! 671: VOID ! 672: (*RESET_COMPLETE_HANDLER) ( ! 673: IN NDIS_HANDLE ProtocolBindingContext, ! 674: IN NDIS_STATUS Status ! 675: ); ! 676: ! 677: typedef ! 678: VOID ! 679: (*REQUEST_COMPLETE_HANDLER) ( ! 680: IN NDIS_HANDLE ProtocolBindingContext, ! 681: IN PNDIS_REQUEST NdisRequest, ! 682: IN NDIS_STATUS Status ! 683: ); ! 684: ! 685: typedef ! 686: NDIS_STATUS ! 687: (*RECEIVE_HANDLER) ( ! 688: IN NDIS_HANDLE ProtocolBindingContext, ! 689: IN NDIS_HANDLE MacReceiveContext, ! 690: IN PVOID HeaderBuffer, ! 691: IN UINT HeaderBufferSize, ! 692: IN PVOID LookAheadBuffer, ! 693: IN UINT LookaheadBufferSize, ! 694: IN UINT PacketSize ! 695: ); ! 696: ! 697: typedef ! 698: VOID ! 699: (*RECEIVE_COMPLETE_HANDLER) ( ! 700: IN NDIS_HANDLE ProtocolBindingContext ! 701: ); ! 702: ! 703: typedef ! 704: VOID ! 705: (*STATUS_HANDLER) ( ! 706: IN NDIS_HANDLE ProtocolBindingContext, ! 707: IN NDIS_STATUS GeneralStatus, ! 708: IN PVOID StatusBuffer, ! 709: IN UINT StatusBufferSize ! 710: ); ! 711: ! 712: typedef ! 713: VOID ! 714: (*STATUS_COMPLETE_HANDLER) ( ! 715: IN NDIS_HANDLE ProtocolBindingContext ! 716: ); ! 717: ! 718: ! 719: typedef struct _NDIS_PROTOCOL_CHARACTERISTICS { ! 720: UCHAR MajorNdisVersion; ! 721: UCHAR MinorNdisVersion; ! 722: UINT Reserved; ! 723: OPEN_ADAPTER_COMPLETE_HANDLER OpenAdapterCompleteHandler; ! 724: CLOSE_ADAPTER_COMPLETE_HANDLER CloseAdapterCompleteHandler; ! 725: SEND_COMPLETE_HANDLER SendCompleteHandler; ! 726: TRANSFER_DATA_COMPLETE_HANDLER TransferDataCompleteHandler; ! 727: RESET_COMPLETE_HANDLER ResetCompleteHandler; ! 728: REQUEST_COMPLETE_HANDLER RequestCompleteHandler; ! 729: RECEIVE_HANDLER ReceiveHandler; ! 730: RECEIVE_COMPLETE_HANDLER ReceiveCompleteHandler; ! 731: STATUS_HANDLER StatusHandler; ! 732: STATUS_COMPLETE_HANDLER StatusCompleteHandler; ! 733: NDIS_STRING Name; ! 734: } NDIS_PROTOCOL_CHARACTERISTICS, *PNDIS_PROTOCOL_CHARACTERISTICS; ! 735: ! 736: ! 737: typedef ! 738: VOID ! 739: (*PNDIS_SYNCHRONIZE_ROUTINE) ( ! 740: IN PVOID SynchronizeContext ! 741: ); ! 742: ! 743: // ! 744: // Function types for NDIS_MAC_CHARACTERISTICS ! 745: // ! 746: ! 747: ! 748: typedef ! 749: NDIS_STATUS ! 750: (*OPEN_ADAPTER_HANDLER) ( ! 751: OUT PNDIS_STATUS OpenErrorStatus, ! 752: OUT NDIS_HANDLE *MacBindingHandle, ! 753: OUT PUINT SelectedMediumIndex, ! 754: IN PNDIS_MEDIUM MediumArray, ! 755: IN UINT MediumArraySize, ! 756: IN NDIS_HANDLE NdisBindingContext, ! 757: IN NDIS_HANDLE MacAdapterContext, ! 758: IN UINT OpenOptions, ! 759: IN PSTRING AddressingInformation OPTIONAL ! 760: ); ! 761: ! 762: typedef ! 763: NDIS_STATUS ! 764: (*CLOSE_ADAPTER_HANDLER) ( ! 765: IN NDIS_HANDLE MacBindingHandle ! 766: ); ! 767: ! 768: typedef ! 769: NDIS_STATUS ! 770: (*SEND_HANDLER) ( ! 771: IN NDIS_HANDLE MacBindingHandle, ! 772: IN PNDIS_PACKET Packet ! 773: ); ! 774: ! 775: typedef ! 776: NDIS_STATUS ! 777: (*TRANSFER_DATA_HANDLER) ( ! 778: IN NDIS_HANDLE MacBindingHandle, ! 779: IN NDIS_HANDLE MacReceiveContext, ! 780: IN UINT ByteOffset, ! 781: IN UINT BytesToTransfer, ! 782: OUT PNDIS_PACKET Packet, ! 783: OUT PUINT BytesTransferred ! 784: ); ! 785: ! 786: typedef ! 787: NDIS_STATUS ! 788: (*RESET_HANDLER) ( ! 789: IN NDIS_HANDLE MacBindingHandle ! 790: ); ! 791: ! 792: typedef ! 793: NDIS_STATUS ! 794: (*REQUEST_HANDLER) ( ! 795: IN NDIS_HANDLE MacBindingHandle, ! 796: IN PNDIS_REQUEST NdisRequest ! 797: ); ! 798: ! 799: typedef ! 800: NDIS_STATUS ! 801: (*QUERY_GLOBAL_STATISTICS_HANDLER) ( ! 802: IN NDIS_HANDLE MacAdapterContext, ! 803: IN PNDIS_REQUEST NdisRequest ! 804: ); ! 805: ! 806: typedef ! 807: VOID ! 808: (*UNLOAD_MAC_HANDLER) ( ! 809: IN NDIS_HANDLE MacMacContext ! 810: ); ! 811: ! 812: typedef ! 813: NDIS_STATUS ! 814: (*ADD_ADAPTER_HANDLER) ( ! 815: IN NDIS_HANDLE MacMacContext, ! 816: IN NDIS_HANDLE WrapperConfigurationContext, ! 817: IN PNDIS_STRING AdapterName ! 818: ); ! 819: ! 820: typedef ! 821: VOID ! 822: (*REMOVE_ADAPTER_HANDLER) ( ! 823: IN NDIS_HANDLE MacAdapterContext ! 824: ); ! 825: ! 826: ! 827: typedef struct _NDIS_MAC_CHARACTERISTICS { ! 828: UCHAR MajorNdisVersion; ! 829: UCHAR MinorNdisVersion; ! 830: UINT Reserved; ! 831: OPEN_ADAPTER_HANDLER OpenAdapterHandler; ! 832: CLOSE_ADAPTER_HANDLER CloseAdapterHandler; ! 833: SEND_HANDLER SendHandler; ! 834: TRANSFER_DATA_HANDLER TransferDataHandler; ! 835: RESET_HANDLER ResetHandler; ! 836: REQUEST_HANDLER RequestHandler; ! 837: QUERY_GLOBAL_STATISTICS_HANDLER QueryGlobalStatisticsHandler; ! 838: UNLOAD_MAC_HANDLER UnloadMacHandler; ! 839: ADD_ADAPTER_HANDLER AddAdapterHandler; ! 840: REMOVE_ADAPTER_HANDLER RemoveAdapterHandler; ! 841: NDIS_STRING Name; ! 842: } NDIS_MAC_CHARACTERISTICS, *PNDIS_MAC_CHARACTERISTICS; ! 843: ! 844: ! 845: // ! 846: // Definition for shutdown handler ! 847: // ! 848: ! 849: typedef ! 850: VOID ! 851: (*ADAPTER_SHUTDOWN_HANDLER) ( ! 852: IN PVOID ShutdownContext ! 853: ); ! 854: ! 855: ! 856: ! 857: // ! 858: // block used for references... ! 859: // ! 860: ! 861: typedef struct _REFERENCE { ! 862: NDIS_SPIN_LOCK SpinLock; ! 863: USHORT ReferenceCount; ! 864: BOOLEAN Closing; ! 865: } REFERENCE, * PREFERENCE; ! 866: ! 867: ! 868: // ! 869: // This holds a map register entry. ! 870: // ! 871: ! 872: typedef struct _MAP_REGISTER_ENTRY { ! 873: PVOID MapRegister; ! 874: BOOLEAN WriteToDevice; ! 875: } MAP_REGISTER_ENTRY, * PMAP_REGISTER_ENTRY; ! 876: ! 877: // ! 878: // declare these first since they point to each other ! 879: // ! 880: ! 881: typedef struct _NDIS_WRAPPER_HANDLE NDIS_WRAPPER_HANDLE, * PNDIS_WRAPPER_HANDLE; ! 882: typedef struct _NDIS_MAC_BLOCK NDIS_MAC_BLOCK, * PNDIS_MAC_BLOCK; ! 883: typedef struct _NDIS_ADAPTER_BLOCK NDIS_ADAPTER_BLOCK, * PNDIS_ADAPTER_BLOCK; ! 884: typedef struct _NDIS_PROTOCOL_BLOCK NDIS_PROTOCOL_BLOCK, * PNDIS_PROTOCOL_BLOCK; ! 885: typedef struct _NDIS_OPEN_BLOCK NDIS_OPEN_BLOCK, * PNDIS_OPEN_BLOCK; ! 886: ! 887: ! 888: // ! 889: // MAC specific considerations. ! 890: // ! 891: ! 892: struct _NDIS_WRAPPER_HANDLE { ! 893: ! 894: // ! 895: // These store the PDRIVER_OBJECT that ! 896: // the MAC passes to NdisInitializeWrapper until it can be ! 897: // used by NdisRegisterMac and NdisTerminateWrapper. ! 898: // ! 899: ! 900: PDRIVER_OBJECT NdisWrapperDriver; ! 901: ! 902: HANDLE NdisWrapperConfigurationHandle; ! 903: ! 904: }; ! 905: ! 906: ! 907: ! 908: ! 909: // ! 910: // one of these per MAC ! 911: // ! 912: ! 913: struct _NDIS_MAC_BLOCK { ! 914: PNDIS_ADAPTER_BLOCK AdapterQueue; // queue of adapters for this MAC ! 915: NDIS_HANDLE MacMacContext; // Context for calling MACUnload and ! 916: // MACAddAdapter. ! 917: ! 918: REFERENCE Ref; // contains spinlock for AdapterQueue ! 919: UINT Length; // of this NDIS_MAC_BLOCK structure ! 920: NDIS_MAC_CHARACTERISTICS MacCharacteristics; // handler addresses ! 921: PNDIS_WRAPPER_HANDLE NdisMacInfo; // Mac information. ! 922: PNDIS_MAC_BLOCK NextMac; ! 923: KEVENT AdaptersRemovedEvent; // used to find when all adapters are gone. ! 924: BOOLEAN Unloading; // TRUE if unloading ! 925: ! 926: }; ! 927: ! 928: // ! 929: // one of these per adapter registered on a MAC ! 930: // ! 931: ! 932: struct _NDIS_ADAPTER_BLOCK { ! 933: PDEVICE_OBJECT DeviceObject; // created by NdisRegisterAdapter ! 934: PNDIS_MAC_BLOCK MacHandle; // pointer to our MAC block ! 935: NDIS_HANDLE MacAdapterContext; // context when calling MacOpenAdapter ! 936: NDIS_STRING AdapterName; // how NdisOpenAdapter refers to us ! 937: PNDIS_OPEN_BLOCK OpenQueue; // queue of opens for this adapter ! 938: PNDIS_ADAPTER_BLOCK NextAdapter; // used by MAC's AdapterQueue ! 939: REFERENCE Ref; // contains spinlock for OpenQueue ! 940: BOOLEAN BeingRemoved; // TRUE if adapter is being removed ! 941: ! 942: // ! 943: // Resource information ! 944: // ! 945: PCM_RESOURCE_LIST Resources; ! 946: ! 947: // ! 948: // Handling of shutdown ! 949: // ! 950: ADAPTER_SHUTDOWN_HANDLER ShutdownRoutine; ! 951: PVOID ShutdownContext; ! 952: ! 953: // ! 954: // contains adapter information ! 955: // ! 956: ULONG BusNumber; ! 957: NDIS_INTERFACE_TYPE BusType; ! 958: ULONG ChannelNumber; ! 959: NDIS_INTERFACE_TYPE AdapterType; ! 960: BOOLEAN Master; ! 961: ULONG PhysicalMapRegistersNeeded; ! 962: ULONG MaximumPhysicalMapping; ! 963: ULONG InitialPort; ! 964: ULONG NumberOfPorts; ! 965: ! 966: // ! 967: // Holds the mapping for ports, if needed. ! 968: // ! 969: PUCHAR InitialPortMapping; ! 970: ! 971: // ! 972: // TRUE if InitialPortMapping was mapped with NdisMapIoSpace. ! 973: // ! 974: BOOLEAN InitialPortMapped; ! 975: ! 976: // ! 977: // This is the offset added to the port passed to NdisXXXPort to ! 978: // get to the real value to be passed to the NDIS_XXX_PORT macros. ! 979: // It equals InitialPortMapping - InitialPort; that is, the ! 980: // mapped "address" of port 0, even if we didn't actually ! 981: // map port 0. ! 982: // ! 983: PUCHAR PortOffset; ! 984: ! 985: // ! 986: // Holds the map registers for this adapter. ! 987: // ! 988: PMAP_REGISTER_ENTRY MapRegisters; ! 989: ! 990: // ! 991: // These two are used temporarily while allocating ! 992: // the map registers. ! 993: // ! 994: KEVENT AllocationEvent; ! 995: UINT CurrentMapRegister; ! 996: PADAPTER_OBJECT SystemAdapterObject; ! 997: ! 998: }; ! 999: ! 1000: // ! 1001: // one of these per protocol registered ! 1002: // ! 1003: ! 1004: struct _NDIS_PROTOCOL_BLOCK { ! 1005: PNDIS_OPEN_BLOCK OpenQueue; // queue of opens for this protocol ! 1006: REFERENCE Ref; // contains spinlock for OpenQueue ! 1007: UINT Length; // of this NDIS_PROTOCOL_BLOCK struct ! 1008: NDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics; // handler addresses ! 1009: }; ! 1010: ! 1011: // ! 1012: // one of these per open on an adapter/protocol ! 1013: // ! 1014: ! 1015: struct _NDIS_OPEN_BLOCK { ! 1016: PNDIS_MAC_BLOCK MacHandle; // pointer to our MAC ! 1017: NDIS_HANDLE MacBindingHandle; // context when calling MacXX funcs ! 1018: PNDIS_ADAPTER_BLOCK AdapterHandle; // pointer to our adapter ! 1019: PNDIS_PROTOCOL_BLOCK ProtocolHandle; // pointer to our protocol ! 1020: NDIS_HANDLE ProtocolBindingContext; // context when calling ProtXX funcs ! 1021: PNDIS_OPEN_BLOCK AdapterNextOpen; // used by adapter's OpenQueue ! 1022: PNDIS_OPEN_BLOCK ProtocolNextOpen; // used by protocol's OpenQueue ! 1023: PFILE_OBJECT FileObject; // created by operating system ! 1024: BOOLEAN Closing; // TRUE when removing this struct ! 1025: NDIS_HANDLE CloseRequestHandle; // 0 indicates an internal close ! 1026: NDIS_SPIN_LOCK SpinLock; // guards Closing ! 1027: ! 1028: // ! 1029: // These are optimizations for getting to MAC routines. They are not ! 1030: // necessary, but are here to save a dereference through the MAC block. ! 1031: // ! 1032: ! 1033: SEND_HANDLER SendHandler; ! 1034: TRANSFER_DATA_HANDLER TransferDataHandler; ! 1035: ! 1036: // ! 1037: // These are optimizations for getting to PROTOCOL routines. They are not ! 1038: // necessary, but are here to save a dereference through the PROTOCOL block. ! 1039: // ! 1040: ! 1041: SEND_COMPLETE_HANDLER SendCompleteHandler; ! 1042: TRANSFER_DATA_COMPLETE_HANDLER TransferDataCompleteHandler; ! 1043: RECEIVE_HANDLER ReceiveHandler; ! 1044: RECEIVE_COMPLETE_HANDLER ReceiveCompleteHandler; ! 1045: ! 1046: }; ! 1047: ! 1048: // ! 1049: // Types of Memory (not mutually exclusive) ! 1050: // ! 1051: ! 1052: #define NDIS_MEMORY_CONTIGUOUS 0x00000001 ! 1053: #define NDIS_MEMORY_NONCACHED 0x00000002 ! 1054: ! 1055: // ! 1056: // Open options ! 1057: // ! 1058: #define NDIS_OPEN_RECEIVE_NOT_REENTRANT 0x00000001 ! 1059: ! 1060: // ! 1061: // NDIS_STATUS values ! 1062: // ! 1063: ! 1064: #define NDIS_STATUS_SUCCESS ((NDIS_STATUS) STATUS_SUCCESS) ! 1065: #define NDIS_STATUS_PENDING ((NDIS_STATUS) STATUS_PENDING) ! 1066: #define NDIS_STATUS_NOT_RECOGNIZED ((NDIS_STATUS)0x00010001L) ! 1067: #define NDIS_STATUS_NOT_COPIED ((NDIS_STATUS)0x00010002L) ! 1068: ! 1069: #define NDIS_STATUS_ONLINE ((NDIS_STATUS)0x40010003L) ! 1070: #define NDIS_STATUS_RESET_START ((NDIS_STATUS)0x40010004L) ! 1071: #define NDIS_STATUS_RESET_END ((NDIS_STATUS)0x40010005L) ! 1072: #define NDIS_STATUS_RING_STATUS ((NDIS_STATUS)0x40010006L) ! 1073: #define NDIS_STATUS_CLOSED ((NDIS_STATUS)0x40010007L) ! 1074: #define NDIS_STATUS_WAN_LINE_UP ((NDIS_STATUS)0x40010008L) ! 1075: #define NDIS_STATUS_WAN_LINE_DOWN ((NDIS_STATUS)0x40010009L) ! 1076: #define NDIS_STATUS_WAN_FRAGMENT ((NDIS_STATUS)0x4001000AL) ! 1077: ! 1078: #define NDIS_STATUS_NOT_RESETTABLE ((NDIS_STATUS)0x80010001L) ! 1079: #define NDIS_STATUS_SOFT_ERRORS ((NDIS_STATUS)0x80010003L) ! 1080: #define NDIS_STATUS_HARD_ERRORS ((NDIS_STATUS)0x80010004L) ! 1081: ! 1082: #define NDIS_STATUS_FAILURE ((NDIS_STATUS) STATUS_UNSUCCESSFUL) ! 1083: #define NDIS_STATUS_RESOURCES ((NDIS_STATUS) \ ! 1084: STATUS_INSUFFICIENT_RESOURCES) ! 1085: #define NDIS_STATUS_CLOSING ((NDIS_STATUS)0xC0010002L) ! 1086: #define NDIS_STATUS_BAD_VERSION ((NDIS_STATUS)0xC0010004L) ! 1087: #define NDIS_STATUS_BAD_CHARACTERISTICS ((NDIS_STATUS)0xC0010005L) ! 1088: #define NDIS_STATUS_ADAPTER_NOT_FOUND ((NDIS_STATUS)0xC0010006L) ! 1089: #define NDIS_STATUS_OPEN_FAILED ((NDIS_STATUS)0xC0010007L) ! 1090: #define NDIS_STATUS_DEVICE_FAILED ((NDIS_STATUS)0xC0010008L) ! 1091: #define NDIS_STATUS_MULTICAST_FULL ((NDIS_STATUS)0xC0010009L) ! 1092: #define NDIS_STATUS_MULTICAST_EXISTS ((NDIS_STATUS)0xC001000AL) ! 1093: #define NDIS_STATUS_MULTICAST_NOT_FOUND ((NDIS_STATUS)0xC001000BL) ! 1094: #define NDIS_STATUS_REQUEST_ABORTED ((NDIS_STATUS)0xC001000CL) ! 1095: #define NDIS_STATUS_RESET_IN_PROGRESS ((NDIS_STATUS)0xC001000DL) ! 1096: #define NDIS_STATUS_CLOSING_INDICATING ((NDIS_STATUS)0xC001000EL) ! 1097: #define NDIS_STATUS_NOT_SUPPORTED ((NDIS_STATUS)STATUS_NOT_SUPPORTED) ! 1098: #define NDIS_STATUS_INVALID_PACKET ((NDIS_STATUS)0xC001000FL) ! 1099: #define NDIS_STATUS_OPEN_LIST_FULL ((NDIS_STATUS)0xC0010010L) ! 1100: #define NDIS_STATUS_ADAPTER_NOT_READY ((NDIS_STATUS)0xC0010011L) ! 1101: #define NDIS_STATUS_ADAPTER_NOT_OPEN ((NDIS_STATUS)0xC0010012L) ! 1102: #define NDIS_STATUS_NOT_INDICATING ((NDIS_STATUS)0xC0010013L) ! 1103: #define NDIS_STATUS_INVALID_LENGTH ((NDIS_STATUS)0xC0010014L) ! 1104: #define NDIS_STATUS_INVALID_DATA ((NDIS_STATUS)0xC0010015L) ! 1105: #define NDIS_STATUS_BUFFER_TOO_SHORT ((NDIS_STATUS)0xC0010016L) ! 1106: #define NDIS_STATUS_INVALID_OID ((NDIS_STATUS)0xC0010017L) ! 1107: #define NDIS_STATUS_ADAPTER_REMOVED ((NDIS_STATUS)0xC0010018L) ! 1108: #define NDIS_STATUS_UNSUPPORTED_MEDIA ((NDIS_STATUS)0xC0010019L) ! 1109: #define NDIS_STATUS_GROUP_ADDRESS_IN_USE ((NDIS_STATUS)0xC001001AL) ! 1110: #define NDIS_STATUS_FILE_NOT_FOUND ((NDIS_STATUS)0xC001001BL) ! 1111: #define NDIS_STATUS_ERROR_READING_FILE ((NDIS_STATUS)0xC001001CL) ! 1112: #define NDIS_STATUS_ALREADY_MAPPED ((NDIS_STATUS)0xC001001DL) ! 1113: #define NDIS_STATUS_RESOURCE_CONFLICT ((NDIS_STATUS)0xC001001EL) ! 1114: ! 1115: #define NDIS_STATUS_TOKEN_RING_OPEN_ERROR ((NDIS_STATUS)0xC0011000L) ! 1116: ! 1117: ! 1118: // ! 1119: // used in error logging ! 1120: // ! 1121: ! 1122: #define NDIS_ERROR_CODE ULONG ! 1123: ! 1124: #define NDIS_ERROR_CODE_RESOURCE_CONFLICT EVENT_NDIS_RESOURCE_CONFLICT ! 1125: #define NDIS_ERROR_CODE_OUT_OF_RESOURCES EVENT_NDIS_OUT_OF_RESOURCE ! 1126: #define NDIS_ERROR_CODE_HARDWARE_FAILURE EVENT_NDIS_HARDWARE_FAILURE ! 1127: #define NDIS_ERROR_CODE_ADAPTER_NOT_FOUND EVENT_NDIS_ADAPTER_NOT_FOUND ! 1128: #define NDIS_ERROR_CODE_INTERRUPT_CONNECT EVENT_NDIS_INTERRUPT_CONNECT ! 1129: #define NDIS_ERROR_CODE_DRIVER_FAILURE EVENT_NDIS_DRIVER_FAILURE ! 1130: #define NDIS_ERROR_CODE_BAD_VERSION EVENT_NDIS_BAD_VERSION ! 1131: #define NDIS_ERROR_CODE_TIMEOUT EVENT_NDIS_TIMEOUT ! 1132: #define NDIS_ERROR_CODE_NETWORK_ADDRESS EVENT_NDIS_NETWORK_ADDRESS ! 1133: #define NDIS_ERROR_CODE_UNSUPPORTED_CONFIGURATION EVENT_NDIS_UNSUPPORTED_CONFIGURATION ! 1134: #define NDIS_ERROR_CODE_INVALID_VALUE_FROM_ADAPTER EVENT_NDIS_INVALID_VALUE_FROM_ADAPTER ! 1135: #define NDIS_ERROR_CODE_MISSING_CONFIGURATION_PARAMETER EVENT_NDIS_MISSING_CONFIGURATION_PARAMETER ! 1136: #define NDIS_ERROR_CODE_BAD_IO_BASE_ADDRESS EVENT_NDIS_BAD_IO_BASE_ADDRESS ! 1137: #define NDIS_ERROR_CODE_RECEIVE_SPACE_SMALL EVENT_NDIS_RECEIVE_SPACE_SMALL ! 1138: #define NDIS_ERROR_CODE_ADAPTER_DISABLED EVENT_NDIS_ADAPTER_DISABLED ! 1139: ! 1140: ! 1141: ! 1142: #define INTERNAL ! 1143: ! 1144: ! 1145: ! 1146: // ! 1147: // Ndis Spin Locks ! 1148: // ! 1149: ! 1150: /*++ ! 1151: ! 1152: VOID ! 1153: NdisAllocateSpinLock( ! 1154: IN PNDIS_SPIN_LOCK SpinLock; ! 1155: ); ! 1156: ! 1157: --*/ ! 1158: ! 1159: ! 1160: #ifdef NDISDBG ! 1161: #define NdisAllocateSpinLock(_SpinLock) { \ ! 1162: IF_TRACE(TRACE_ALL) { \ ! 1163: NdisPrint1("==>NdisAllocateSpinLock\n"); \ ! 1164: } \ ! 1165: KeInitializeSpinLock(&(_SpinLock)->SpinLock); \ ! 1166: IF_TRACE(TRACE_ALL) { \ ! 1167: NdisPrint1("<==NdisAllocateSpinLock\n"); \ ! 1168: } \ ! 1169: } ! 1170: #else ! 1171: #define NdisAllocateSpinLock(_SpinLock) { \ ! 1172: KeInitializeSpinLock(&(_SpinLock)->SpinLock); \ ! 1173: } ! 1174: #endif ! 1175: ! 1176: /*++ ! 1177: ! 1178: VOID ! 1179: NdisFreeSpinLock( ! 1180: IN PNDIS_SPIN_LOCK SpinLock; ! 1181: ); ! 1182: ! 1183: --*/ ! 1184: ! 1185: #ifdef NDISDBG ! 1186: #define NdisFreeSpinLock(_SpinLock) { \ ! 1187: IF_TRACE(TRACE_ALL) { \ ! 1188: NdisPrint1("==>NdisFreeSpinLock\n"); \ ! 1189: } \ ! 1190: IF_TRACE(TRACE_ALL) { \ ! 1191: NdisPrint1("<==NdisFreeSpinLock\n"); \ ! 1192: } \ ! 1193: } ! 1194: #else ! 1195: #define NdisFreeSpinLock(_SpinLock) { \ ! 1196: } ! 1197: #endif ! 1198: ! 1199: ! 1200: /*++ ! 1201: ! 1202: VOID ! 1203: NdisAcquireSpinLock( ! 1204: IN PNDIS_SPIN_LOCK SpinLock; ! 1205: ); ! 1206: ! 1207: --*/ ! 1208: ! 1209: #ifdef NDISDBG ! 1210: #define NdisAcquireSpinLock(_SpinLock) { \ ! 1211: KIRQL OldIrql; \ ! 1212: IF_TRACE(TRACE_ALL) { \ ! 1213: NdisPrint1("==>NdisAcquireSpinLock\n"); \ ! 1214: } \ ! 1215: KeAcquireSpinLock(&(_SpinLock)->SpinLock, &OldIrql); \ ! 1216: (_SpinLock)->OldIrql = OldIrql; \ ! 1217: IF_TRACE(TRACE_ALL) { \ ! 1218: NdisPrint1("<==NdisAcquireSpinLock\n"); \ ! 1219: } \ ! 1220: } ! 1221: #else ! 1222: #define NdisAcquireSpinLock(_SpinLock) { \ ! 1223: KeAcquireSpinLock(&(_SpinLock)->SpinLock, &(_SpinLock)->OldIrql); \ ! 1224: } ! 1225: #endif ! 1226: ! 1227: ! 1228: /*++ ! 1229: ! 1230: VOID ! 1231: NdisReleaseSpinLock( ! 1232: IN PNDIS_SPIN_LOCK SpinLock; ! 1233: ); ! 1234: ! 1235: --*/ ! 1236: ! 1237: #ifdef NDISDBG ! 1238: #define NdisReleaseSpinLock(_SpinLock) { \ ! 1239: KIRQL CurrentIrql = (_SpinLock)->OldIrql; \ ! 1240: IF_TRACE(TRACE_ALL) { \ ! 1241: NdisPrint1("==>NdisReleaseSpinLock \n"); \ ! 1242: } \ ! 1243: KeReleaseSpinLock(&(_SpinLock)->SpinLock, CurrentIrql); \ ! 1244: IF_TRACE(TRACE_ALL) { \ ! 1245: NdisPrint1("<==NdisReleaseSpinLock\n"); \ ! 1246: }\ ! 1247: } ! 1248: #else ! 1249: #define NdisReleaseSpinLock(_SpinLock) { \ ! 1250: KeReleaseSpinLock(&(_SpinLock)->SpinLock,(_SpinLock)->OldIrql); \ ! 1251: } ! 1252: #endif ! 1253: ! 1254: /*++ ! 1255: ! 1256: VOID ! 1257: NdisDprAcquireSpinLock( ! 1258: IN PNDIS_SPIN_LOCK SpinLock; ! 1259: ); ! 1260: ! 1261: --*/ ! 1262: ! 1263: #ifdef NDISDBG ! 1264: #define NdisDprAcquireSpinLock(_SpinLock) { \ ! 1265: IF_TRACE(TRACE_ALL) { \ ! 1266: NdisPrint1("==>NdisDprAcquireSpinLock\n"); \ ! 1267: } \ ! 1268: KeAcquireSpinLockAtDpcLevel(&(_SpinLock)->SpinLock); \ ! 1269: (_SpinLock)->OldIrql = DISPATCH_LEVEL; \ ! 1270: IF_TRACE(TRACE_ALL) { \ ! 1271: NdisPrint1("<==NdisDprAcquireSpinLock\n"); \ ! 1272: } \ ! 1273: } ! 1274: #else ! 1275: #define NdisDprAcquireSpinLock(_SpinLock) { \ ! 1276: KeAcquireSpinLockAtDpcLevel(&(_SpinLock)->SpinLock); \ ! 1277: (_SpinLock)->OldIrql = DISPATCH_LEVEL; \ ! 1278: } ! 1279: #endif ! 1280: ! 1281: ! 1282: /*++ ! 1283: ! 1284: VOID ! 1285: NdisDprReleaseSpinLock( ! 1286: IN PNDIS_SPIN_LOCK SpinLock; ! 1287: ); ! 1288: ! 1289: --*/ ! 1290: ! 1291: #ifdef NDISDBG ! 1292: #define NdisDprReleaseSpinLock(_SpinLock) { \ ! 1293: IF_TRACE(TRACE_ALL) { \ ! 1294: NdisPrint1("==>NdisDprReleaseSpinLock \n"); \ ! 1295: } \ ! 1296: KeReleaseSpinLockFromDpcLevel(&(_SpinLock)->SpinLock); \ ! 1297: IF_TRACE(TRACE_ALL) { \ ! 1298: NdisPrint1("<==NdisDprReleaseSpinLock\n"); \ ! 1299: }\ ! 1300: } ! 1301: #else ! 1302: #define NdisDprReleaseSpinLock(_SpinLock) { \ ! 1303: KeReleaseSpinLockFromDpcLevel(&(_SpinLock)->SpinLock); \ ! 1304: } ! 1305: #endif ! 1306: ! 1307: ! 1308: ! 1309: // ! 1310: // Interlocked support functions ! 1311: // ! 1312: ! 1313: /*++ ! 1314: ! 1315: VOID ! 1316: NdisInterlockedAddUlong( ! 1317: IN PULONG Addend, ! 1318: IN ULONG Increment, ! 1319: IN PNDIS_SPIN_LOCK SpinLock ! 1320: ); ! 1321: ! 1322: --*/ ! 1323: ! 1324: #define NdisInterlockedAddUlong(_Addend, _Increment, _SpinLock) \ ! 1325: ExInterlockedAddUlong(_Addend, _Increment, &(_SpinLock)->SpinLock) ! 1326: ! 1327: ! 1328: /*++ ! 1329: ! 1330: PLIST_ENTRY ! 1331: NdisInterlockedInsertHeadList( ! 1332: IN PLIST_ENTRY ListHead, ! 1333: IN PLIST_ENTRY ListEntry, ! 1334: IN PNDIS_SPIN_LOCK SpinLock ! 1335: ); ! 1336: ! 1337: --*/ ! 1338: ! 1339: #define NdisInterlockedInsertHeadList(_ListHead, _ListEntry, _SpinLock) \ ! 1340: ExInterlockedInsertHeadList(_ListHead, _ListEntry, &(_SpinLock)->SpinLock) ! 1341: ! 1342: ! 1343: /*++ ! 1344: ! 1345: PLIST_ENTRY ! 1346: NdisInterlockedInsertTailList( ! 1347: IN PLIST_ENTRY ListHead, ! 1348: IN PLIST_ENTRY ListEntry, ! 1349: IN PNDIS_SPIN_LOCK SpinLock ! 1350: ); ! 1351: ! 1352: --*/ ! 1353: ! 1354: #define NdisInterlockedInsertTailList(_ListHead, _ListEntry, _SpinLock) \ ! 1355: ExInterlockedInsertTailList(_ListHead, _ListEntry, &(_SpinLock)->SpinLock) ! 1356: ! 1357: ! 1358: /*++ ! 1359: ! 1360: PLIST_ENTRY ! 1361: NdisInterlockedRemoveHeadList( ! 1362: IN PLIST_ENTRY ListHead, ! 1363: IN PNDIS_SPIN_LOCK SpinLock ! 1364: ); ! 1365: ! 1366: --*/ ! 1367: ! 1368: #define NdisInterlockedRemoveHeadList(_ListHead, _SpinLock) \ ! 1369: ExInterlockedRemoveHeadList(_ListHead, &(_SpinLock)->SpinLock) ! 1370: ! 1371: ! 1372: // ! 1373: // Routines to access packet flags ! 1374: // ! 1375: ! 1376: /*++ ! 1377: ! 1378: VOID ! 1379: NdisSetSendFlags( ! 1380: IN PNDIS_PACKET Packet, ! 1381: IN UINT Flags ! 1382: ); ! 1383: ! 1384: --*/ ! 1385: ! 1386: #define NdisSetSendFlags(_Packet,_Flags) \ ! 1387: (_Packet)->Private.Flags = (_Flags) ! 1388: ! 1389: /*++ ! 1390: ! 1391: VOID ! 1392: NdisQuerySendFlags( ! 1393: IN PNDIS_PACKET Packet, ! 1394: OUT PUINT Flags ! 1395: ); ! 1396: ! 1397: --*/ ! 1398: ! 1399: #define NdisQuerySendFlags(_Packet,_Flags) \ ! 1400: *(_Flags) = (_Packet)->Private.Flags ! 1401: ! 1402: ! 1403: ! 1404: ! 1405: // ! 1406: // general reference/dereference functions ! 1407: // ! 1408: ! 1409: INTERNAL ! 1410: BOOLEAN ! 1411: NdisReferenceRef( ! 1412: IN PREFERENCE RefP ! 1413: ); ! 1414: ! 1415: ! 1416: INTERNAL ! 1417: BOOLEAN ! 1418: NdisDereferenceRef( ! 1419: PREFERENCE RefP ! 1420: ); ! 1421: ! 1422: ! 1423: INTERNAL ! 1424: VOID ! 1425: NdisInitializeRef( ! 1426: PREFERENCE RefP ! 1427: ); ! 1428: ! 1429: ! 1430: INTERNAL ! 1431: BOOLEAN ! 1432: NdisCloseRef( ! 1433: PREFERENCE RefP ! 1434: ); ! 1435: ! 1436: ! 1437: /*++ ! 1438: INTERNAL ! 1439: BOOLEAN ! 1440: NdisReferenceProtocol( ! 1441: IN PNDIS_PROTOCOL_BLOCK ProtP ! 1442: ); ! 1443: --*/ ! 1444: ! 1445: #define NdisReferenceProtocol(ProtP) \ ! 1446: NdisReferenceRef(&(ProtP)->Ref) ! 1447: ! 1448: ! 1449: ! 1450: INTERNAL ! 1451: BOOLEAN ! 1452: QueueOpenOnProtocol( ! 1453: IN PNDIS_OPEN_BLOCK OpenP, ! 1454: IN PNDIS_PROTOCOL_BLOCK ProtP ! 1455: ); ! 1456: ! 1457: ! 1458: /*++ ! 1459: INTERNAL ! 1460: VOID ! 1461: NdisDereferenceProtocol( ! 1462: PNDIS_PROTOCOL_BLOCK ProtP ! 1463: ); ! 1464: --*/ ! 1465: #define NdisDereferenceProtocol(ProtP) { \ ! 1466: if (NdisDereferenceRef(&(ProtP)->Ref)) { \ ! 1467: ExFreePool((PVOID)(ProtP)); \ ! 1468: } \ ! 1469: } ! 1470: ! 1471: ! 1472: ! 1473: INTERNAL ! 1474: VOID ! 1475: NdisDeQueueOpenOnProtocol( ! 1476: PNDIS_OPEN_BLOCK OpenP, ! 1477: PNDIS_PROTOCOL_BLOCK ProtP ! 1478: ); ! 1479: ! 1480: ! 1481: INTERNAL ! 1482: BOOLEAN ! 1483: NdisFinishOpen( ! 1484: PNDIS_OPEN_BLOCK OpenP ! 1485: ); ! 1486: ! 1487: ! 1488: INTERNAL ! 1489: VOID ! 1490: NdisKillOpenAndNotifyProtocol( ! 1491: PNDIS_OPEN_BLOCK OldOpenP ! 1492: ); ! 1493: ! 1494: ! 1495: INTERNAL ! 1496: BOOLEAN ! 1497: NdisKillOpen( ! 1498: PNDIS_OPEN_BLOCK OldOpenP ! 1499: ); ! 1500: ! 1501: /*++ ! 1502: INTERNAL ! 1503: BOOLEAN ! 1504: NdisReferenceMac( ! 1505: IN PNDIS_MAC_BLOCK MacP ! 1506: ); ! 1507: --*/ ! 1508: #define NdisReferenceMac(MacP) \ ! 1509: NdisReferenceRef(&(MacP)->Ref) ! 1510: ! 1511: static ! 1512: VOID ! 1513: NdisDereferenceMac( ! 1514: PNDIS_MAC_BLOCK MacP ! 1515: ); ! 1516: ! 1517: INTERNAL ! 1518: BOOLEAN ! 1519: NdisQueueAdapterOnMac( ! 1520: PNDIS_ADAPTER_BLOCK AdaptP, ! 1521: PNDIS_MAC_BLOCK MacP ! 1522: ); ! 1523: ! 1524: INTERNAL ! 1525: VOID ! 1526: NdisDeQueueAdapterOnMac( ! 1527: PNDIS_ADAPTER_BLOCK AdaptP, ! 1528: PNDIS_MAC_BLOCK MacP ! 1529: ); ! 1530: ! 1531: /*++ ! 1532: INTERNAL ! 1533: BOOLEAN ! 1534: NdisReferenceAdapter( ! 1535: IN PNDIS_ADAPTER_BLOCK AdaptP ! 1536: ); ! 1537: --*/ ! 1538: #define NdisReferenceAdapter(AdaptP) \ ! 1539: NdisReferenceRef(&(AdaptP)->Ref) ! 1540: ! 1541: ! 1542: INTERNAL ! 1543: BOOLEAN ! 1544: NdisQueueOpenOnAdapter( ! 1545: PNDIS_OPEN_BLOCK OpenP, ! 1546: PNDIS_ADAPTER_BLOCK AdaptP ! 1547: ); ! 1548: ! 1549: INTERNAL ! 1550: VOID ! 1551: NdisKillAdapter( ! 1552: PNDIS_ADAPTER_BLOCK OldAdaptP ! 1553: ); ! 1554: ! 1555: INTERNAL ! 1556: VOID ! 1557: NdisDereferenceAdapter( ! 1558: PNDIS_ADAPTER_BLOCK AdaptP ! 1559: ); ! 1560: ! 1561: INTERNAL ! 1562: VOID ! 1563: NdisDeQueueOpenOnAdapter( ! 1564: PNDIS_OPEN_BLOCK OpenP, ! 1565: PNDIS_ADAPTER_BLOCK AdaptP ! 1566: ); ! 1567: ! 1568: INTERNAL ! 1569: NDIS_STATUS ! 1570: NdisCallDriverAddAdapter( ! 1571: IN PNDIS_MAC_BLOCK NewMacP ! 1572: ); ! 1573: ! 1574: // ! 1575: // Configuration Requests ! 1576: // ! 1577: ! 1578: VOID ! 1579: NdisOpenConfiguration( ! 1580: OUT PNDIS_STATUS Status, ! 1581: OUT PNDIS_HANDLE ConfigurationHandle, ! 1582: IN NDIS_HANDLE WrapperConfigurationContext ! 1583: ); ! 1584: ! 1585: VOID ! 1586: NdisReadConfiguration( ! 1587: OUT PNDIS_STATUS Status, ! 1588: OUT PNDIS_CONFIGURATION_PARAMETER *ParameterValue, ! 1589: IN NDIS_HANDLE ConfigurationHandle, ! 1590: IN PNDIS_STRING Keyword, ! 1591: IN NDIS_PARAMETER_TYPE ParameterType ! 1592: ); ! 1593: ! 1594: VOID ! 1595: NdisCloseConfiguration( ! 1596: IN NDIS_HANDLE ConfigurationHandle ! 1597: ); ! 1598: ! 1599: VOID ! 1600: NdisReadNetworkAddress( ! 1601: OUT PNDIS_STATUS Status, ! 1602: OUT PVOID * NetworkAddress, ! 1603: OUT PUINT NetworkAddressLength, ! 1604: IN NDIS_HANDLE ConfigurationHandle ! 1605: ); ! 1606: ! 1607: VOID ! 1608: NdisReadBindingInformation( ! 1609: OUT PNDIS_STATUS Status, ! 1610: OUT PNDIS_STRING * Binding, ! 1611: IN NDIS_HANDLE ConfigurationHandle ! 1612: ); ! 1613: ! 1614: ! 1615: VOID ! 1616: NdisReadEisaSlotInformation( ! 1617: OUT PNDIS_STATUS Status, ! 1618: IN NDIS_HANDLE WrapperConfigurationContext, ! 1619: OUT PUINT SlotNumber, ! 1620: OUT PNDIS_EISA_FUNCTION_INFORMATION EisaData ! 1621: ); ! 1622: ! 1623: VOID ! 1624: NdisReadEisaSlotInformationEx( ! 1625: OUT PNDIS_STATUS Status, ! 1626: IN NDIS_HANDLE WrapperConfigurationContext, ! 1627: OUT PUINT SlotNumber, ! 1628: OUT PNDIS_EISA_FUNCTION_INFORMATION *EisaData, ! 1629: OUT PUINT NumberOfFunctions ! 1630: ); ! 1631: ! 1632: VOID ! 1633: NdisReadMcaPosInformation( ! 1634: OUT PNDIS_STATUS Status, ! 1635: IN NDIS_HANDLE WrapperConfigurationContext, ! 1636: IN PUINT ChannelNumber, ! 1637: OUT PNDIS_MCA_POS_DATA McaData ! 1638: ); ! 1639: ! 1640: // ! 1641: // Packet and Buffer Requests ! 1642: // ! 1643: ! 1644: VOID ! 1645: NdisAllocatePacketPool( ! 1646: OUT PNDIS_STATUS Status, ! 1647: OUT PNDIS_HANDLE PoolHandle, ! 1648: IN UINT NumberOfDescriptors, ! 1649: IN UINT ProtocolReservedLength ! 1650: ); ! 1651: ! 1652: ! 1653: #ifdef NDISDBG ! 1654: VOID ! 1655: NdisFreePacketPool( ! 1656: IN NDIS_HANDLE PoolHandle ! 1657: ); ! 1658: #else ! 1659: #define NdisFreePacketPool(PoolHandle) {\ ! 1660: NdisFreeSpinLock(&((PNDIS_PACKET_POOL)PoolHandle)->SpinLock);\ ! 1661: ExFreePool(PoolHandle); \ ! 1662: } ! 1663: #endif ! 1664: ! 1665: VOID ! 1666: NdisAllocateBufferPool( ! 1667: OUT PNDIS_STATUS Status, ! 1668: OUT PNDIS_HANDLE PoolHandle, ! 1669: IN UINT NumberOfDescriptors ! 1670: ); ! 1671: ! 1672: VOID ! 1673: NdisFreeBufferPool( ! 1674: IN NDIS_HANDLE PoolHandle ! 1675: ); ! 1676: ! 1677: VOID ! 1678: NdisAllocateBuffer( ! 1679: OUT PNDIS_STATUS Status, ! 1680: OUT PNDIS_BUFFER * Buffer, ! 1681: IN NDIS_HANDLE PoolHandle, ! 1682: IN PVOID VirtualAddress, ! 1683: IN UINT Length ! 1684: ); ! 1685: ! 1686: ! 1687: VOID ! 1688: NdisCopyBuffer( ! 1689: OUT PNDIS_STATUS Status, ! 1690: OUT PNDIS_BUFFER * Buffer, ! 1691: IN NDIS_HANDLE PoolHandle, ! 1692: IN PVOID MemoryDescriptor, ! 1693: IN UINT Offset, ! 1694: IN UINT Length ! 1695: ); ! 1696: ! 1697: ! 1698: /*++ ! 1699: ! 1700: VOID ! 1701: NdisFreeBuffer( ! 1702: IN PNDIS_BUFFER Buffer ! 1703: ); ! 1704: ! 1705: --*/ ! 1706: ! 1707: #define NdisFreeBuffer(Buffer) \ ! 1708: IoFreeMdl(Buffer) ! 1709: ! 1710: ! 1711: ! 1712: VOID ! 1713: NdisQueryBuffer( ! 1714: IN PNDIS_BUFFER Buffer, ! 1715: OUT PVOID * VirtualAddress, ! 1716: OUT PUINT Length ! 1717: ); ! 1718: ! 1719: ! 1720: /*++ ! 1721: ! 1722: VOID ! 1723: NdisGetBufferPhysicalArraySize( ! 1724: IN PNDIS_BUFFER Buffer, ! 1725: OUT PUINT ArraySize ! 1726: ); ! 1727: ! 1728: --*/ ! 1729: ! 1730: #define NdisGetBufferPhysicalArraySize(Buffer, ArraySize) \ ! 1731: (*(ArraySize) = NDIS_BUFFER_TO_SPAN_PAGES(Buffer)) ! 1732: ! 1733: ! 1734: ! 1735: ! 1736: /*++ ! 1737: VOID ! 1738: NdisBufferGetSystemSpecific( ! 1739: IN PNDIS_BUFFER Buffer, ! 1740: OUT PVOID * SystemSpecific ! 1741: ); ! 1742: --*/ ! 1743: ! 1744: // ! 1745: //BUGBUG: What's system specific about this buffer anyway.... ! 1746: // Ask adam when he comes back. ! 1747: #define NdisBufferGetSystemSpecific(Buffer, SystemSpecific) \ ! 1748: *(SystemSpecific) = (Buffer) ! 1749: ! 1750: ! 1751: /*++ ! 1752: ! 1753: VOID ! 1754: NdisAdjustBufferLength( ! 1755: IN PNDIS_BUFFER Buffer, ! 1756: IN UINT Length ! 1757: ); ! 1758: ! 1759: --*/ ! 1760: ! 1761: #define NdisAdjustBufferLength(Buffer, Length) \ ! 1762: (((Buffer)->ByteCount) = (Length)) ! 1763: ! 1764: ! 1765: /*++ ! 1766: ! 1767: NDIS_BUFFER_LINKAGE( ! 1768: IN PNDIS_BUFFER Buffer ! 1769: ); ! 1770: ! 1771: --*/ ! 1772: ! 1773: #define NDIS_BUFFER_LINKAGE(Buffer) \ ! 1774: ((Buffer)->Next) ! 1775: ! 1776: ! 1777: ! 1778: VOID ! 1779: NdisAllocatePacket( ! 1780: OUT PNDIS_STATUS Status, ! 1781: OUT PNDIS_PACKET * Packet, ! 1782: IN NDIS_HANDLE PoolHandle ! 1783: ); ! 1784: ! 1785: ! 1786: #ifdef NDISDBG ! 1787: VOID ! 1788: NdisFreePacket( ! 1789: IN PNDIS_PACKET Packet ! 1790: ); ! 1791: #else ! 1792: #define NdisFreePacket(Packet) {\ ! 1793: NdisAcquireSpinLock(&(Packet)->Private.Pool->SpinLock); \ ! 1794: (Packet)->Private.Head = (PNDIS_BUFFER)(Packet)->Private.Pool->FreeList; \ ! 1795: (Packet)->Private.Pool->FreeList = (Packet); \ ! 1796: NdisReleaseSpinLock(&(Packet)->Private.Pool->SpinLock); \ ! 1797: } ! 1798: #endif ! 1799: ! 1800: ! 1801: #ifdef NDISDBG ! 1802: VOID ! 1803: NdisReinitializePacket( \ ! 1804: IN OUT PNDIS_PACKET Packet \ ! 1805: ); ! 1806: #else ! 1807: #define NdisReinitializePacket(Packet) { \ ! 1808: (Packet)->Private.Head = (PNDIS_BUFFER)NULL; \ ! 1809: (Packet)->Private.ValidCounts = FALSE; \ ! 1810: } ! 1811: #endif ! 1812: ! 1813: ! 1814: /*++ ! 1815: ! 1816: VOID ! 1817: NdisRecalculatePacketCounts( ! 1818: IN OUT PNDIS_PACKET Packet ! 1819: ); ! 1820: ! 1821: --*/ ! 1822: ! 1823: #define NdisRecalculatePacketCounts(Packet) { \ ! 1824: { \ ! 1825: PNDIS_BUFFER TmpBuffer = (Packet)->Private.Head; \ ! 1826: if (TmpBuffer) { \ ! 1827: while (TmpBuffer->Next) { \ ! 1828: TmpBuffer = TmpBuffer->Next; \ ! 1829: } \ ! 1830: (Packet)->Private.Tail = TmpBuffer; \ ! 1831: } \ ! 1832: (Packet)->Private.ValidCounts = FALSE; \ ! 1833: } \ ! 1834: } ! 1835: ! 1836: ! 1837: #ifdef NDISDBG ! 1838: VOID ! 1839: NdisChainBufferAtFront( ! 1840: IN OUT PNDIS_PACKET Packet, ! 1841: IN OUT PNDIS_BUFFER Buffer ! 1842: ); ! 1843: #else ! 1844: #define NdisChainBufferAtFront(Packet, Buffer) { \ ! 1845: PNDIS_BUFFER TmpBuffer = (Buffer); \ ! 1846: \ ! 1847: for (;;) { \ ! 1848: if (TmpBuffer->Next == (PNDIS_BUFFER)NULL) \ ! 1849: break; \ ! 1850: TmpBuffer = TmpBuffer->Next; \ ! 1851: } \ ! 1852: if ((Packet)->Private.Head == (PNDIS_BUFFER)NULL) { \ ! 1853: (Packet)->Private.Tail = TmpBuffer; \ ! 1854: } \ ! 1855: TmpBuffer->Next = (Packet)->Private.Head; \ ! 1856: (Packet)->Private.Head = (Buffer); \ ! 1857: (Packet)->Private.ValidCounts = FALSE; \ ! 1858: } ! 1859: #endif ! 1860: ! 1861: #ifdef NDISDBG ! 1862: VOID ! 1863: NdisChainBufferAtBack( ! 1864: IN OUT PNDIS_PACKET Packet, ! 1865: IN OUT PNDIS_BUFFER Buffer ! 1866: ); ! 1867: #else ! 1868: #define NdisChainBufferAtBack(Packet, Buffer) { \ ! 1869: PNDIS_BUFFER TmpBuffer = (Buffer); \ ! 1870: \ ! 1871: for (;;) { \ ! 1872: if (TmpBuffer->Next == (PNDIS_BUFFER)NULL) \ ! 1873: break; \ ! 1874: TmpBuffer = TmpBuffer->Next; \ ! 1875: } \ ! 1876: if ((Packet)->Private.Head != (PNDIS_BUFFER)NULL) { \ ! 1877: (Packet)->Private.Tail->Next = (Buffer); \ ! 1878: } else { \ ! 1879: (Packet)->Private.Head = (Buffer); \ ! 1880: } \ ! 1881: (Packet)->Private.Tail = TmpBuffer; \ ! 1882: TmpBuffer->Next = (PNDIS_BUFFER)NULL; \ ! 1883: (Packet)->Private.ValidCounts = FALSE; \ ! 1884: } ! 1885: #endif ! 1886: ! 1887: VOID ! 1888: NdisUnchainBufferAtFront( ! 1889: IN OUT PNDIS_PACKET Packet, ! 1890: OUT PNDIS_BUFFER * Buffer ! 1891: ); ! 1892: ! 1893: VOID ! 1894: NdisUnchainBufferAtBack( ! 1895: IN OUT PNDIS_PACKET Packet, ! 1896: OUT PNDIS_BUFFER * Buffer ! 1897: ); ! 1898: ! 1899: ! 1900: #ifdef NDISDBG ! 1901: VOID ! 1902: NdisQueryPacket( ! 1903: IN PNDIS_PACKET Packet, ! 1904: OUT PUINT PhysicalBufferCount OPTIONAL, ! 1905: OUT PUINT BufferCount OPTIONAL, ! 1906: OUT PNDIS_BUFFER * FirstBuffer OPTIONAL, ! 1907: OUT PUINT TotalPacketLength OPTIONAL ! 1908: ); ! 1909: #else ! 1910: #define NdisQueryPacket(Packet, PhysicalBufferCount, BufferCount, FirstBuffer, TotalPacketLength) \ ! 1911: { \ ! 1912: PNDIS_PACKET _Packet = Packet; \ ! 1913: PUINT _PhysicalBufferCount = PhysicalBufferCount; \ ! 1914: PUINT _BufferCount = BufferCount; \ ! 1915: PNDIS_BUFFER *_FirstBuffer = FirstBuffer; \ ! 1916: PUINT _TotalPacketLength = TotalPacketLength; \ ! 1917: \ ! 1918: if (_FirstBuffer) *_FirstBuffer = (Packet)->Private.Head; \ ! 1919: if (_PhysicalBufferCount || _BufferCount || _TotalPacketLength) { \ ! 1920: if (!(Packet)->Private.ValidCounts) { \ ! 1921: PNDIS_BUFFER TmpBuffer = (Packet)->Private.Head; \ ! 1922: UINT PTotalLength = 0, PPhysicalCount = 0, PAddedCount = 0; \ ! 1923: \ ! 1924: while (TmpBuffer != (PNDIS_BUFFER)NULL) { \ ! 1925: PTotalLength += MmGetMdlByteCount(TmpBuffer); \ ! 1926: PPhysicalCount += NDIS_BUFFER_TO_SPAN_PAGES(TmpBuffer); \ ! 1927: ++PAddedCount; \ ! 1928: TmpBuffer = TmpBuffer->Next; \ ! 1929: } \ ! 1930: (Packet)->Private.Count = PAddedCount; \ ! 1931: (Packet)->Private.TotalLength = PTotalLength; \ ! 1932: (Packet)->Private.PhysicalCount = PPhysicalCount; \ ! 1933: (Packet)->Private.ValidCounts = TRUE; \ ! 1934: } \ ! 1935: if (_PhysicalBufferCount) *_PhysicalBufferCount = (Packet)->Private.PhysicalCount; \ ! 1936: if (_BufferCount) *_BufferCount = (Packet)->Private.Count; \ ! 1937: if (_TotalPacketLength) *_TotalPacketLength = (Packet)->Private.TotalLength; \ ! 1938: } \ ! 1939: } ! 1940: #endif ! 1941: ! 1942: ! 1943: #ifdef NDISDBG ! 1944: VOID ! 1945: NdisGetNextBuffer( ! 1946: IN PNDIS_BUFFER CurrentBuffer, ! 1947: OUT PNDIS_BUFFER * NextBuffer ! 1948: ); ! 1949: #else ! 1950: #define NdisGetNextBuffer(CurrentBuffer, NextBuffer) {\ ! 1951: *(NextBuffer) = (CurrentBuffer)->Next; \ ! 1952: } ! 1953: #endif ! 1954: ! 1955: ! 1956: VOID ! 1957: NdisCopyFromPacketToPacket( ! 1958: IN PNDIS_PACKET Destination, ! 1959: IN UINT DestinationOffset, ! 1960: IN UINT BytesToCopy, ! 1961: IN PNDIS_PACKET Source, ! 1962: IN UINT SourceOffset, ! 1963: OUT PUINT BytesCopied ! 1964: ); ! 1965: ! 1966: ! 1967: // ! 1968: // Operating System Requests ! 1969: // ! 1970: ! 1971: VOID ! 1972: NdisMapIoSpace( ! 1973: OUT PNDIS_STATUS Status, ! 1974: OUT PVOID * VirtualAddress, ! 1975: IN NDIS_HANDLE NdisAdapterHandle, ! 1976: IN NDIS_PHYSICAL_ADDRESS PhysicalAddress, ! 1977: IN UINT Length ! 1978: ); ! 1979: ! 1980: #ifdef _ALPHA_ ! 1981: ! 1982: /*++ ! 1983: VOID ! 1984: NdisUnmapIoSpace( ! 1985: IN NDIS_HANDLE NdisAdapterHandle, ! 1986: IN PVOID VirtualAddress, ! 1987: IN UINT Length ! 1988: ) ! 1989: --*/ ! 1990: #define NdisUnmapIoSpace(Handle,VirtualAddress,Length) {} ! 1991: ! 1992: #else ! 1993: ! 1994: /*++ ! 1995: VOID ! 1996: NdisUnmapIoSpace( ! 1997: IN NDIS_HANDLE NdisAdapterHandle, ! 1998: IN PVOID VirtualAddress, ! 1999: IN UINT Length ! 2000: ) ! 2001: --*/ ! 2002: #define NdisUnmapIoSpace(Handle,VirtualAddress,Length) \ ! 2003: MmUnmapIoSpace((VirtualAddress), (Length)); ! 2004: ! 2005: #endif ! 2006: ! 2007: ! 2008: NDIS_STATUS ! 2009: NdisAllocateMemory( ! 2010: OUT PVOID *VirtualAddress, ! 2011: IN UINT Length, ! 2012: IN UINT MemoryFlags, ! 2013: IN NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress ! 2014: ); ! 2015: ! 2016: ! 2017: VOID ! 2018: NdisFreeMemory( ! 2019: IN PVOID VirtualAddress, ! 2020: IN UINT Length, ! 2021: IN UINT MemoryFlags ! 2022: ); ! 2023: ! 2024: typedef ! 2025: VOID ! 2026: (*PNDIS_TIMER_FUNCTION) ( ! 2027: IN PVOID SystemSpecific1, ! 2028: IN PVOID FunctionContext, ! 2029: IN PVOID SystemSpecific2, ! 2030: IN PVOID SystemSpecific3 ! 2031: ); ! 2032: ! 2033: VOID ! 2034: NdisInitializeTimer( ! 2035: IN OUT PNDIS_TIMER Timer, ! 2036: IN PNDIS_TIMER_FUNCTION TimerFunction, ! 2037: IN PVOID FunctionContext ! 2038: ); ! 2039: ! 2040: VOID ! 2041: NdisSetTimer( ! 2042: IN PNDIS_TIMER Timer, ! 2043: IN UINT MillisecondsToDelay ! 2044: ); ! 2045: ! 2046: /*++ ! 2047: VOID ! 2048: NdisCancelTimer( ! 2049: IN PNDIS_TIMER Timer, ! 2050: OUT PBOOLEAN TimerCancelled ! 2051: ) ! 2052: --*/ ! 2053: #define NdisCancelTimer(NdisTimer,TimerCancelled) \ ! 2054: (*(TimerCancelled) = KeCancelTimer(&((NdisTimer)->Timer))) ! 2055: ! 2056: /*++ ! 2057: VOID ! 2058: NdisStallExecution( ! 2059: IN UINT MicrosecondsToStall ! 2060: ) ! 2061: --*/ ! 2062: ! 2063: #define NdisStallExecution(MicroSecondsToStall) \ ! 2064: KeStallExecutionProcessor(MicroSecondsToStall) ! 2065: ! 2066: ! 2067: VOID ! 2068: NdisInitializeInterrupt( ! 2069: OUT PNDIS_STATUS Status, ! 2070: IN OUT PNDIS_INTERRUPT Interrupt, ! 2071: IN NDIS_HANDLE NdisAdapterHandle, ! 2072: IN PNDIS_INTERRUPT_SERVICE InterruptServiceRoutine, ! 2073: IN PVOID InterruptContext, ! 2074: IN PNDIS_DEFERRED_PROCESSING DeferredProcessingRoutine, ! 2075: IN UINT InterruptVector, ! 2076: IN UINT InterruptLevel, ! 2077: IN BOOLEAN SharedInterrupt, ! 2078: IN NDIS_INTERRUPT_MODE InterruptMode ! 2079: ); ! 2080: ! 2081: VOID ! 2082: NdisRemoveInterrupt( ! 2083: IN PNDIS_INTERRUPT Interrupt ! 2084: ); ! 2085: ! 2086: /*++ ! 2087: BOOLEAN ! 2088: NdisSynchronizeWithInterrupt( ! 2089: IN PNDIS_INTERRUPT Interrupt, ! 2090: IN PVOID SynchronizeFunction, ! 2091: IN PVOID SynchronizeContext ! 2092: ) ! 2093: --*/ ! 2094: ! 2095: #define NdisSynchronizeWithInterrupt(Interrupt,Function,Context) \ ! 2096: KeSynchronizeExecution( \ ! 2097: (Interrupt)->InterruptObject,\ ! 2098: (PKSYNCHRONIZE_ROUTINE)Function,\ ! 2099: Context \ ! 2100: ) ! 2101: ! 2102: // ! 2103: // Simple I/O support ! 2104: // ! 2105: ! 2106: VOID ! 2107: NdisOpenFile( ! 2108: OUT PNDIS_STATUS Status, ! 2109: OUT PNDIS_HANDLE FileHandle, ! 2110: OUT PUINT FileLength, ! 2111: IN PNDIS_STRING FileName, ! 2112: IN NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress ! 2113: ); ! 2114: ! 2115: VOID ! 2116: NdisCloseFile( ! 2117: IN NDIS_HANDLE FileHandle ! 2118: ); ! 2119: ! 2120: VOID ! 2121: NdisMapFile( ! 2122: OUT PNDIS_STATUS Status, ! 2123: OUT PVOID * MappedBuffer, ! 2124: IN NDIS_HANDLE FileHandle ! 2125: ); ! 2126: ! 2127: VOID ! 2128: NdisUnmapFile( ! 2129: IN NDIS_HANDLE FileHandle ! 2130: ); ! 2131: ! 2132: ! 2133: // ! 2134: // Portability extensions ! 2135: // ! 2136: ! 2137: /*++ ! 2138: VOID ! 2139: NdisFlushBuffer( ! 2140: IN PNDIS_BUFFER Buffer, ! 2141: IN BOOLEAN WriteToDevice ! 2142: ) ! 2143: --*/ ! 2144: ! 2145: #define NdisFlushBuffer(Buffer,WriteToDevice) \ ! 2146: KeFlushIoBuffers((Buffer),!(WriteToDevice), TRUE) ! 2147: ! 2148: ! 2149: /*++ ! 2150: ULONG ! 2151: NdisGetCacheFillSize( ! 2152: ) ! 2153: --*/ ! 2154: #define NdisGetCacheFillSize() \ ! 2155: HalGetDmaAlignmentRequirement() ! 2156: ! 2157: // ! 2158: // This macro is used to convert a port number as the caller ! 2159: // thinks of it, to a port number as it should be passed to ! 2160: // READ/WRITE_PORT. ! 2161: // ! 2162: ! 2163: #define NDIS_PORT_TO_PORT(Handle,Port) (((PNDIS_ADAPTER_BLOCK)(Handle))->PortOffset + (Port)) ! 2164: ! 2165: ! 2166: // ! 2167: // Write Port ! 2168: // ! 2169: ! 2170: /*++ ! 2171: VOID ! 2172: NdisWritePortUchar( ! 2173: IN NDIS_HANDLE NdisAdapterHandle, ! 2174: IN ULONG Port, ! 2175: IN UCHAR Data ! 2176: ) ! 2177: --*/ ! 2178: #define NdisWritePortUchar(Handle,Port,Data) \ ! 2179: WRITE_PORT_UCHAR((PUCHAR)(NDIS_PORT_TO_PORT(Handle,Port)),(UCHAR)(Data)) ! 2180: ! 2181: /*++ ! 2182: VOID ! 2183: NdisWritePortUshort( ! 2184: IN NDIS_HANDLE NdisAdapterHandle, ! 2185: IN ULONG Port, ! 2186: IN USHORT Data ! 2187: ) ! 2188: --*/ ! 2189: #define NdisWritePortUshort(Handle,Port,Data) \ ! 2190: WRITE_PORT_USHORT((PUSHORT)(NDIS_PORT_TO_PORT(Handle,Port)),(USHORT)(Data)) ! 2191: ! 2192: ! 2193: /*++ ! 2194: VOID ! 2195: NdisWritePortUlong( ! 2196: IN NDIS_HANDLE NdisAdapterHandle, ! 2197: IN ULONG Port, ! 2198: IN ULONG Data ! 2199: ) ! 2200: --*/ ! 2201: #define NdisWritePortUlong(Handle,Port,Data) \ ! 2202: WRITE_PORT_ULONG((PULONG)(NDIS_PORT_TO_PORT(Handle,Port)),(ULONG)(Data)) ! 2203: ! 2204: ! 2205: // ! 2206: // Write Port Buffers ! 2207: // ! 2208: ! 2209: /*++ ! 2210: VOID ! 2211: NdisWritePortBufferUchar( ! 2212: IN NDIS_HANDLE NdisAdapterHandle, ! 2213: IN ULONG Port, ! 2214: IN PUCHAR Buffer, ! 2215: IN ULONG Length ! 2216: ) ! 2217: --*/ ! 2218: #ifdef _M_IX86 ! 2219: #define NdisWritePortBufferUchar(Handle,Port,Buffer,Length) \ ! 2220: WRITE_PORT_BUFFER_UCHAR((PUCHAR)(NDIS_PORT_TO_PORT(Handle,Port)),(PUCHAR)(Buffer),(Length)) ! 2221: #else ! 2222: #define NdisWritePortBufferUchar(Handle,Port,Buffer,Length) \ ! 2223: { \ ! 2224: ULONG _Port = (ULONG)NDIS_PORT_TO_PORT(Handle, Port); \ ! 2225: PUCHAR _Current = (Buffer); \ ! 2226: PUCHAR _End = _Current + (Length); \ ! 2227: for ( ; _Current < _End; ++_Current) { \ ! 2228: WRITE_PORT_UCHAR((PUCHAR)_Port,*_Current); \ ! 2229: } \ ! 2230: } ! 2231: #endif ! 2232: ! 2233: /*++ ! 2234: VOID ! 2235: NdisWritePortBufferUshort( ! 2236: IN NDIS_HANDLE NdisAdapterHandle, ! 2237: IN ULONG Port, ! 2238: IN PUSHORT Buffer, ! 2239: IN ULONG Length ! 2240: ) ! 2241: --*/ ! 2242: #ifdef _M_IX86 ! 2243: #define NdisWritePortBufferUshort(Handle,Port,Buffer,Length) \ ! 2244: WRITE_PORT_BUFFER_USHORT((PUSHORT)(NDIS_PORT_TO_PORT(Handle,Port)),(PUSHORT)(Buffer),(Length)) ! 2245: #else ! 2246: #define NdisWritePortBufferUshort(Handle,Port,Buffer,Length) \ ! 2247: { \ ! 2248: ULONG _Port = (ULONG)NDIS_PORT_TO_PORT(Handle, Port); \ ! 2249: PUSHORT _Current = (Buffer); \ ! 2250: PUSHORT _End = _Current + (Length); \ ! 2251: for ( ; _Current < _End; ++_Current) { \ ! 2252: WRITE_PORT_USHORT((PUSHORT)_Port,*(UNALIGNED USHORT *)_Current); \ ! 2253: } \ ! 2254: } ! 2255: #endif ! 2256: ! 2257: ! 2258: /*++ ! 2259: VOID ! 2260: NdisWritePortBufferUlong( ! 2261: IN NDIS_HANDLE NdisAdapterHandle, ! 2262: IN ULONG Port, ! 2263: IN PULONG Buffer, ! 2264: IN ULONG Length ! 2265: ) ! 2266: --*/ ! 2267: #ifdef _M_IX86 ! 2268: #define NdisWritePortBufferUlong(Handle,Port,Buffer,Length) \ ! 2269: WRITE_PORT_BUFFER_ULONG((PULONG)(NDIS_PORT_TO_PORT(Handle,Port)),(PULONG)(Buffer),(Length)) ! 2270: #else ! 2271: #define NdisWritePortBufferUlong(Handle,Port,Buffer,Length) \ ! 2272: { \ ! 2273: ULONG _Port = (ULONG)NDIS_PORT_TO_PORT(Handle, Port); \ ! 2274: PULONG _Current = (Buffer); \ ! 2275: PULONG _End = _Current + (Length); \ ! 2276: for ( ; _Current < _End; ++_Current) { \ ! 2277: WRITE_PORT_ULONG((PULONG)_Port,*(UNALIGNED ULONG *)_Current); \ ! 2278: } \ ! 2279: } ! 2280: #endif ! 2281: ! 2282: ! 2283: // ! 2284: // Read Ports ! 2285: // ! 2286: ! 2287: /*++ ! 2288: VOID ! 2289: NdisReadPortUchar( ! 2290: IN NDIS_HANDLE NdisAdapterHandle, ! 2291: IN ULONG Port, ! 2292: OUT PUCHAR Data ! 2293: ) ! 2294: --*/ ! 2295: #define NdisReadPortUchar(Handle,Port, Data) \ ! 2296: *(Data) = READ_PORT_UCHAR((PUCHAR)(NDIS_PORT_TO_PORT(Handle,Port))) ! 2297: ! 2298: /*++ ! 2299: VOID ! 2300: NdisReadPortUshort( ! 2301: IN NDIS_HANDLE NdisAdapterHandle, ! 2302: IN ULONG Port, ! 2303: OUT PUSHORT Data ! 2304: ) ! 2305: --*/ ! 2306: #define NdisReadPortUshort(Handle,Port,Data) \ ! 2307: *(Data) = READ_PORT_USHORT((PUSHORT)(NDIS_PORT_TO_PORT(Handle,Port))) ! 2308: ! 2309: ! 2310: /*++ ! 2311: VOID ! 2312: NdisReadPortUlong( ! 2313: IN NDIS_HANDLE NdisAdapterHandle, ! 2314: IN ULONG Port, ! 2315: OUT PULONG Data ! 2316: ) ! 2317: --*/ ! 2318: #define NdisReadPortUlong(Handle,Port,Data) \ ! 2319: *(Data) = READ_PORT_ULONG((PULONG)(NDIS_PORT_TO_PORT(Handle,Port))) ! 2320: ! 2321: // ! 2322: // Read Buffer Ports ! 2323: // ! 2324: ! 2325: /*++ ! 2326: VOID ! 2327: NdisReadPortBufferUchar( ! 2328: IN NDIS_HANDLE NdisAdapterHandle, ! 2329: IN ULONG Port, ! 2330: OUT PUCHAR Buffer, ! 2331: IN ULONG Length ! 2332: ) ! 2333: --*/ ! 2334: #ifdef _M_IX86 ! 2335: #define NdisReadPortBufferUchar(Handle,Port,Buffer,Length) \ ! 2336: READ_PORT_BUFFER_UCHAR((PUCHAR)(NDIS_PORT_TO_PORT(Handle,Port)),(PUCHAR)(Buffer),(Length)) ! 2337: #else ! 2338: #define NdisReadPortBufferUchar(Handle,Port,Buffer,Length) \ ! 2339: { \ ! 2340: ULONG _Port = (ULONG)NDIS_PORT_TO_PORT(Handle, Port); \ ! 2341: PUCHAR _Current = (Buffer); \ ! 2342: PUCHAR _End = _Current + (Length); \ ! 2343: for ( ; _Current < _End; ++_Current) { \ ! 2344: *_Current = READ_PORT_UCHAR((PUCHAR)_Port); \ ! 2345: } \ ! 2346: } ! 2347: #endif ! 2348: ! 2349: /*++ ! 2350: VOID ! 2351: NdisReadPortBufferUshort( ! 2352: IN NDIS_HANDLE NdisAdapterHandle, ! 2353: IN ULONG Port, ! 2354: OUT PUSHORT Buffer, ! 2355: IN ULONG Length ! 2356: ) ! 2357: --*/ ! 2358: #ifdef _M_IX86 ! 2359: #define NdisReadPortBufferUshort(Handle,Port,Buffer,Length) \ ! 2360: READ_PORT_BUFFER_USHORT((PUSHORT)(NDIS_PORT_TO_PORT(Handle,Port)),(PUSHORT)(Buffer),(Length)) ! 2361: #else ! 2362: #define NdisReadPortBufferUshort(Handle,Port,Buffer,Length) \ ! 2363: { \ ! 2364: ULONG _Port = (ULONG)NDIS_PORT_TO_PORT(Handle, Port); \ ! 2365: PUSHORT _Current = (Buffer); \ ! 2366: PUSHORT _End = _Current + (Length); \ ! 2367: for ( ; _Current < _End; ++_Current) { \ ! 2368: *(UNALIGNED USHORT *)_Current = READ_PORT_USHORT((PUSHORT)_Port); \ ! 2369: } \ ! 2370: } ! 2371: #endif ! 2372: ! 2373: ! 2374: /*++ ! 2375: VOID ! 2376: NdisReadPortBufferUlong( ! 2377: IN NDIS_HANDLE NdisAdapterHandle, ! 2378: IN ULONG Port, ! 2379: OUT PULONG Buffer, ! 2380: IN ULONG Length ! 2381: ) ! 2382: --*/ ! 2383: #ifdef _M_IX86 ! 2384: #define NdisReadPortBufferUlong(Handle,Port,Buffer) \ ! 2385: READ_PORT_BUFFER_ULONG((PULONG)(NDIS_PORT_TO_PORT(Handle,Port)),(PULONG)(Buffer),(Length)) ! 2386: #else ! 2387: #define NdisReadPortBufferUlong(Handle,Port,Buffer,Length) \ ! 2388: { \ ! 2389: ULONG _Port = (ULONG)NDIS_PORT_TO_PORT(Handle, Port); \ ! 2390: PULONG _Current = (Buffer); \ ! 2391: PULONG _End = _Current + (Length); \ ! 2392: for ( ; _Current < _End; ++_Current) { \ ! 2393: *(UNALIGNED ULONG *)_Current = READ_PORT_ULONG((PULONG)_Port); \ ! 2394: } \ ! 2395: } ! 2396: #endif ! 2397: ! 2398: ! 2399: // ! 2400: // Raw Routines ! 2401: // ! 2402: ! 2403: // ! 2404: // Write Port Raw ! 2405: // ! 2406: ! 2407: /*++ ! 2408: VOID ! 2409: NdisRawWritePortUchar( ! 2410: IN ULONG Port, ! 2411: IN UCHAR Data ! 2412: ) ! 2413: --*/ ! 2414: #define NdisRawWritePortUchar(Port,Data) \ ! 2415: WRITE_PORT_UCHAR((PUCHAR)(Port),(UCHAR)(Data)) ! 2416: ! 2417: /*++ ! 2418: VOID ! 2419: NdisRawWritePortUshort( ! 2420: IN ULONG Port, ! 2421: IN USHORT Data ! 2422: ) ! 2423: --*/ ! 2424: #define NdisRawWritePortUshort(Port,Data) \ ! 2425: WRITE_PORT_USHORT((PUSHORT)(Port),(USHORT)(Data)) ! 2426: ! 2427: ! 2428: /*++ ! 2429: VOID ! 2430: NdisRawWritePortUlong( ! 2431: IN ULONG Port, ! 2432: IN ULONG Data ! 2433: ) ! 2434: --*/ ! 2435: #define NdisRawWritePortUlong(Port,Data) \ ! 2436: WRITE_PORT_ULONG((PULONG)(Port),(ULONG)(Data)) ! 2437: ! 2438: ! 2439: // ! 2440: // Raw Write Port Buffers ! 2441: // ! 2442: ! 2443: /*++ ! 2444: VOID ! 2445: NdisRawWritePortBufferUchar( ! 2446: IN ULONG Port, ! 2447: IN PUCHAR Buffer, ! 2448: IN ULONG Length ! 2449: ) ! 2450: --*/ ! 2451: #ifdef _M_IX86 ! 2452: #define NdisRawWritePortBufferUchar(Port,Buffer,Length) \ ! 2453: WRITE_PORT_BUFFER_UCHAR((PUCHAR)(Port),(PUCHAR)(Buffer),(Length)) ! 2454: #else ! 2455: #define NdisRawWritePortBufferUchar(Port,Buffer,Length) \ ! 2456: { \ ! 2457: ULONG _Port = (ULONG)(Port); \ ! 2458: PUCHAR _Current = (Buffer); \ ! 2459: PUCHAR _End = _Current + (Length); \ ! 2460: for ( ; _Current < _End; ++_Current) { \ ! 2461: WRITE_PORT_UCHAR((PUCHAR)_Port,*_Current); \ ! 2462: } \ ! 2463: } ! 2464: #endif ! 2465: ! 2466: /*++ ! 2467: VOID ! 2468: NdisRawWritePortBufferUshort( ! 2469: IN ULONG Port, ! 2470: IN PUSHORT Buffer, ! 2471: IN ULONG Length ! 2472: ) ! 2473: --*/ ! 2474: #ifdef _M_IX86 ! 2475: #define NdisRawWritePortBufferUshort(Port,Buffer,Length) \ ! 2476: WRITE_PORT_BUFFER_USHORT((PUSHORT)(Port),(PUSHORT)(Buffer),(Length)) ! 2477: #else ! 2478: #define NdisRawWritePortBufferUshort(Port,Buffer,Length) \ ! 2479: { \ ! 2480: ULONG _Port = (ULONG)(Port); \ ! 2481: PUSHORT _Current = (Buffer); \ ! 2482: PUSHORT _End = _Current + (Length); \ ! 2483: for ( ; _Current < _End; ++_Current) { \ ! 2484: WRITE_PORT_USHORT((PUSHORT)_Port,*(UNALIGNED USHORT *)_Current); \ ! 2485: } \ ! 2486: } ! 2487: #endif ! 2488: ! 2489: ! 2490: /*++ ! 2491: VOID ! 2492: NdisRawWritePortBufferUlong( ! 2493: IN ULONG Port, ! 2494: IN PULONG Buffer, ! 2495: IN ULONG Length ! 2496: ) ! 2497: --*/ ! 2498: #ifdef _M_IX86 ! 2499: #define NdisRawWritePortBufferUlong(Port,Buffer,Length) \ ! 2500: WRITE_PORT_BUFFER_ULONG((PULONG)(Port),(PULONG)(Buffer),(Length)) ! 2501: #else ! 2502: #define NdisRawWritePortBufferUlong(Port,Buffer,Length) \ ! 2503: { \ ! 2504: ULONG _Port = (ULONG)(Port); \ ! 2505: PULONG _Current = (Buffer); \ ! 2506: PULONG _End = _Current + (Length); \ ! 2507: for ( ; _Current < _End; ++_Current) { \ ! 2508: WRITE_PORT_ULONG((PULONG)_Port,*(UNALIGNED ULONG *)_Current); \ ! 2509: } \ ! 2510: } ! 2511: #endif ! 2512: ! 2513: ! 2514: // ! 2515: // Raw Read Ports ! 2516: // ! 2517: ! 2518: /*++ ! 2519: VOID ! 2520: NdisRawReadPortUchar( ! 2521: IN ULONG Port, ! 2522: OUT PUCHAR Data ! 2523: ) ! 2524: --*/ ! 2525: #define NdisRawReadPortUchar(Port, Data) \ ! 2526: *(Data) = READ_PORT_UCHAR((PUCHAR)(Port)) ! 2527: ! 2528: /*++ ! 2529: VOID ! 2530: NdisRawReadPortUshort( ! 2531: IN ULONG Port, ! 2532: OUT PUSHORT Data ! 2533: ) ! 2534: --*/ ! 2535: #define NdisRawReadPortUshort(Port,Data) \ ! 2536: *(Data) = READ_PORT_USHORT((PUSHORT)(Port)) ! 2537: ! 2538: ! 2539: /*++ ! 2540: VOID ! 2541: NdisRawReadPortUlong( ! 2542: IN ULONG Port, ! 2543: OUT PULONG Data ! 2544: ) ! 2545: --*/ ! 2546: #define NdisRawReadPortUlong(Port,Data) \ ! 2547: *(Data) = READ_PORT_ULONG((PULONG)(Port)) ! 2548: ! 2549: // ! 2550: // Raw Read Buffer Ports ! 2551: // ! 2552: ! 2553: /*++ ! 2554: VOID ! 2555: NdisRawReadPortBufferUchar( ! 2556: IN ULONG Port, ! 2557: OUT PUCHAR Buffer, ! 2558: IN ULONG Length ! 2559: ) ! 2560: --*/ ! 2561: #ifdef _M_IX86 ! 2562: #define NdisRawReadPortBufferUchar(Port,Buffer,Length) \ ! 2563: READ_PORT_BUFFER_UCHAR((PUCHAR)(Port),(PUCHAR)(Buffer),(Length)) ! 2564: #else ! 2565: #define NdisRawReadPortBufferUchar(Port,Buffer,Length) \ ! 2566: { \ ! 2567: ULONG _Port = (ULONG)(Port); \ ! 2568: PUCHAR _Current = (Buffer); \ ! 2569: PUCHAR _End = _Current + (Length); \ ! 2570: for ( ; _Current < _End; ++_Current) { \ ! 2571: *_Current = READ_PORT_UCHAR((PUCHAR)_Port); \ ! 2572: } \ ! 2573: } ! 2574: #endif ! 2575: ! 2576: /*++ ! 2577: VOID ! 2578: NdisRawReadPortBufferUshort( ! 2579: IN ULONG Port, ! 2580: OUT PUSHORT Buffer, ! 2581: IN ULONG Length ! 2582: ) ! 2583: --*/ ! 2584: #ifdef _M_IX86 ! 2585: #define NdisRawReadPortBufferUshort(Port,Buffer,Length) \ ! 2586: READ_PORT_BUFFER_USHORT((PUSHORT)(Port),(PUSHORT)(Buffer),(Length)) ! 2587: #else ! 2588: #define NdisRawReadPortBufferUshort(Port,Buffer,Length) \ ! 2589: { \ ! 2590: ULONG _Port = (ULONG)(Port); \ ! 2591: PUSHORT _Current = (Buffer); \ ! 2592: PUSHORT _End = _Current + (Length); \ ! 2593: for ( ; _Current < _End; ++_Current) { \ ! 2594: *(UNALIGNED USHORT *)_Current = READ_PORT_USHORT((PUSHORT)_Port); \ ! 2595: } \ ! 2596: } ! 2597: #endif ! 2598: ! 2599: ! 2600: /*++ ! 2601: VOID ! 2602: NdisRawReadPortBufferUlong( ! 2603: IN ULONG Port, ! 2604: OUT PULONG Buffer, ! 2605: IN ULONG Length ! 2606: ) ! 2607: --*/ ! 2608: #ifdef _M_IX86 ! 2609: #define NdisRawReadPortBufferUlong(Port,Buffer,Length) \ ! 2610: READ_PORT_BUFFER_ULONG((PULONG)(Port),(PULONG)(Buffer),(Length)) ! 2611: #else ! 2612: #define NdisRawReadPortBufferUlong(Port,Buffer,Length) \ ! 2613: { \ ! 2614: ULONG _Port = (ULONG)(Port); \ ! 2615: PULONG _Current = (Buffer); \ ! 2616: PULONG _End = _Current + (Length); \ ! 2617: for ( ; _Current < _End; ++_Current) { \ ! 2618: *(UNALIGNED ULONG *)_Current = READ_PORT_ULONG((PULONG)_Port); \ ! 2619: } \ ! 2620: } ! 2621: #endif ! 2622: ! 2623: ! 2624: ! 2625: ! 2626: ! 2627: ! 2628: // ! 2629: // Write Registers ! 2630: // ! 2631: ! 2632: /*++ ! 2633: VOID ! 2634: NdisWriteRegisterUchar( ! 2635: IN PUCHAR Register, ! 2636: IN UCHAR Data ! 2637: ) ! 2638: --*/ ! 2639: ! 2640: #ifdef _M_IX86 ! 2641: ! 2642: #define NdisWriteRegisterUchar(Register,Data) \ ! 2643: *((PUCHAR)(Register)) = (Data) ! 2644: ! 2645: #else ! 2646: ! 2647: #define NdisWriteRegisterUchar(Register,Data) \ ! 2648: { \ ! 2649: WRITE_REGISTER_UCHAR((Register),(Data)); \ ! 2650: READ_REGISTER_UCHAR(Register); \ ! 2651: } ! 2652: ! 2653: #endif ! 2654: ! 2655: /*++ ! 2656: VOID ! 2657: NdisWriteRegisterUshort( ! 2658: IN PUSHORT Register, ! 2659: IN USHORT Data ! 2660: ) ! 2661: --*/ ! 2662: ! 2663: #ifdef _M_IX86 ! 2664: ! 2665: #define NdisWriteRegisterUshort(Register,Data) \ ! 2666: *((PUSHORT)(Register)) = (Data) ! 2667: ! 2668: #else ! 2669: ! 2670: #define NdisWriteRegisterUshort(Register,Data) \ ! 2671: { \ ! 2672: WRITE_REGISTER_USHORT((Register),(Data)); \ ! 2673: READ_REGISTER_USHORT(Register); \ ! 2674: } ! 2675: ! 2676: #endif ! 2677: ! 2678: /*++ ! 2679: VOID ! 2680: NdisWriteRegisterUlong( ! 2681: IN PULONG Register, ! 2682: IN ULONG Data ! 2683: ) ! 2684: --*/ ! 2685: ! 2686: #ifdef _M_IX86 ! 2687: ! 2688: #define NdisWriteRegisterUlong(Register,Data) \ ! 2689: *((PULONG)(Register)) = (Data) ! 2690: ! 2691: #else ! 2692: ! 2693: #define NdisWriteRegisterUlong(Register,Data) \ ! 2694: { \ ! 2695: WRITE_REGISTER_ULONG((Register),(Data)); \ ! 2696: READ_REGISTER_ULONG(Register); \ ! 2697: } ! 2698: ! 2699: #endif ! 2700: ! 2701: /*++ ! 2702: VOID ! 2703: NdisReadRegisterUchar( ! 2704: IN PUCHAR Register, ! 2705: OUT PUCHAR Data ! 2706: ) ! 2707: --*/ ! 2708: #ifdef _M_IX86 ! 2709: ! 2710: #define NdisReadRegisterUchar(Register,Data) \ ! 2711: *((PUCHAR)(Data)) = *(Register) ! 2712: ! 2713: #else ! 2714: ! 2715: #define NdisReadRegisterUchar(Register,Data) \ ! 2716: *(Data) = READ_REGISTER_UCHAR((PUCHAR)(Register)) ! 2717: #endif ! 2718: ! 2719: /*++ ! 2720: VOID ! 2721: NdisReadRegisterUshort( ! 2722: IN PUSHORT Register, ! 2723: OUT PUSHORT Data ! 2724: ) ! 2725: --*/ ! 2726: #ifdef _M_IX86 ! 2727: ! 2728: #define NdisReadRegisterUshort(Register,Data) \ ! 2729: *((PUSHORT)(Data)) = *(Register) ! 2730: ! 2731: #else ! 2732: ! 2733: #define NdisReadRegisterUshort(Register,Data) \ ! 2734: *(Data) = READ_REGISTER_USHORT((PUSHORT)(Register)) ! 2735: #endif ! 2736: ! 2737: /*++ ! 2738: VOID ! 2739: NdisReadRegisterUlong( ! 2740: IN PULONG Register, ! 2741: OUT PULONG Data ! 2742: ) ! 2743: --*/ ! 2744: #ifdef _M_IX86 ! 2745: ! 2746: #define NdisReadRegisterUlong(Register,Data) \ ! 2747: *((PULONG)(Data)) = *(Register) ! 2748: ! 2749: #else ! 2750: ! 2751: #define NdisReadRegisterUlong(Register,Data) \ ! 2752: *(Data) = READ_REGISTER_ULONG((PULONG)(Register)) ! 2753: #endif ! 2754: ! 2755: // ! 2756: // BOOLEAN ! 2757: // NdisEqualString( ! 2758: // IN PNDIS_STRING _String1, ! 2759: // IN PNDIS_STRING _String2, ! 2760: // IN BOOLEAN CaseInsensitive ! 2761: // ); ! 2762: // ! 2763: ! 2764: #define NdisEqualString(_String1,_String2,CaseInsensitive) \ ! 2765: RtlEqualUnicodeString((_String1), (_String2), CaseInsensitive) ! 2766: ! 2767: ! 2768: // ! 2769: // Physical Mapping ! 2770: // ! 2771: ! 2772: // ! 2773: // VOID ! 2774: // NdisStartBufferPhysicalMapping( ! 2775: // IN NDIS_HANDLE NdisAdapterHandle, ! 2776: // IN PNDIS_BUFFER Buffer, ! 2777: // IN ULONG PhysicalMapRegister, ! 2778: // IN BOOLEAN WriteToDevice, ! 2779: // OUT PNDIS_PHYSICAL_ADDRESS_UNIT PhysicalAddressArray, ! 2780: // OUT PUINT ArraySize ! 2781: // ); ! 2782: // ! 2783: ! 2784: #define NdisStartBufferPhysicalMapping( \ ! 2785: NdisAdapterHandle, \ ! 2786: Buffer, \ ! 2787: PhysicalMapRegister, \ ! 2788: Write, \ ! 2789: PhysicalAddressArray, \ ! 2790: ArraySize \ ! 2791: ) \ ! 2792: { \ ! 2793: PNDIS_ADAPTER_BLOCK _AdaptP = (PNDIS_ADAPTER_BLOCK)(NdisAdapterHandle); \ ! 2794: ULONG _PhysicalMapRegister = (PhysicalMapRegister); \ ! 2795: PNDIS_PHYSICAL_ADDRESS_UNIT _PhysicalAddressArray = (PhysicalAddressArray); \ ! 2796: PNDIS_BUFFER _Buffer = (Buffer); \ ! 2797: BOOLEAN _WriteToDevice = (Write); \ ! 2798: PUINT _ArraySize = (ArraySize); \ ! 2799: PHYSICAL_ADDRESS _LogicalAddress; \ ! 2800: PUCHAR _VirtualAddress; \ ! 2801: ULONG _LengthRemaining; \ ! 2802: ULONG _LengthMapped; \ ! 2803: UINT _CurrentArrayLocation; \ ! 2804: _VirtualAddress = MmGetMdlVirtualAddress(_Buffer); \ ! 2805: _LengthRemaining = MmGetMdlByteCount(_Buffer); \ ! 2806: _CurrentArrayLocation = 0; \ ! 2807: while (_LengthRemaining > 0) { \ ! 2808: _LengthMapped = _LengthRemaining; \ ! 2809: _LogicalAddress = IoMapTransfer( \ ! 2810: NULL, \ ! 2811: _Buffer, \ ! 2812: _AdaptP->MapRegisters[_PhysicalMapRegister].MapRegister, \ ! 2813: _VirtualAddress, \ ! 2814: &_LengthMapped, \ ! 2815: _WriteToDevice); \ ! 2816: _PhysicalAddressArray[_CurrentArrayLocation].PhysicalAddress = _LogicalAddress; \ ! 2817: _PhysicalAddressArray[_CurrentArrayLocation].Length = _LengthMapped; \ ! 2818: _LengthRemaining -= _LengthMapped; \ ! 2819: _VirtualAddress += _LengthMapped; \ ! 2820: ++_CurrentArrayLocation; \ ! 2821: } \ ! 2822: _AdaptP->MapRegisters[_PhysicalMapRegister].WriteToDevice = _WriteToDevice; \ ! 2823: *(_ArraySize) = _CurrentArrayLocation; \ ! 2824: } ! 2825: ! 2826: ! 2827: // ! 2828: // VOID ! 2829: // NdisCompleteBufferPhysicalMapping( ! 2830: // IN NDIS_HANDLE NdisAdapterHandle, ! 2831: // IN PNDIS_BUFFER Buffer, ! 2832: // IN ULONG PhysicalMapRegister ! 2833: // ); ! 2834: // ! 2835: ! 2836: #define NdisCompleteBufferPhysicalMapping( \ ! 2837: NdisAdapterHandle, \ ! 2838: Buffer, \ ! 2839: PhysicalMapRegister \ ! 2840: ) \ ! 2841: { \ ! 2842: PNDIS_ADAPTER_BLOCK _AdaptP = (PNDIS_ADAPTER_BLOCK)NdisAdapterHandle; \ ! 2843: IoFlushAdapterBuffers( \ ! 2844: NULL, \ ! 2845: Buffer, \ ! 2846: _AdaptP->MapRegisters[PhysicalMapRegister].MapRegister, \ ! 2847: MmGetMdlVirtualAddress(Buffer), \ ! 2848: MmGetMdlByteCount(Buffer), \ ! 2849: _AdaptP->MapRegisters[PhysicalMapRegister].WriteToDevice); \ ! 2850: } ! 2851: ! 2852: ! 2853: // ! 2854: // Shared memory ! 2855: // ! 2856: ! 2857: VOID ! 2858: NdisAllocateSharedMemory( ! 2859: IN NDIS_HANDLE NdisAdapterHandle, ! 2860: IN ULONG Length, ! 2861: IN BOOLEAN Cached, ! 2862: OUT PVOID *VirtualAddress, ! 2863: OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress ! 2864: ); ! 2865: ! 2866: VOID ! 2867: NdisUpdateSharedMemory( ! 2868: IN NDIS_HANDLE NdisAdapterHandle, ! 2869: IN ULONG Length, ! 2870: IN PVOID VirtualAddress, ! 2871: IN NDIS_PHYSICAL_ADDRESS PhysicalAddress ! 2872: ); ! 2873: ! 2874: VOID ! 2875: NdisFreeSharedMemory( ! 2876: IN NDIS_HANDLE NdisAdapterHandle, ! 2877: IN ULONG Length, ! 2878: IN BOOLEAN Cached, ! 2879: IN PVOID VirtualAddress, ! 2880: IN NDIS_PHYSICAL_ADDRESS PhysicalAddress ! 2881: ); ! 2882: ! 2883: ! 2884: // ! 2885: // DMA operations. ! 2886: // ! 2887: ! 2888: VOID ! 2889: NdisAllocateDmaChannel( ! 2890: OUT PNDIS_STATUS Status, ! 2891: OUT PNDIS_HANDLE NdisDmaHandle, ! 2892: IN NDIS_HANDLE NdisAdapterHandle, ! 2893: IN PNDIS_DMA_DESCRIPTION DmaDescription, ! 2894: IN ULONG MaximumLength ! 2895: ); ! 2896: ! 2897: VOID ! 2898: NdisFreeDmaChannel( ! 2899: IN PNDIS_HANDLE NdisDmaHandle ! 2900: ); ! 2901: ! 2902: VOID ! 2903: NdisSetupDmaTransfer( ! 2904: OUT PNDIS_STATUS Status, ! 2905: IN PNDIS_HANDLE NdisDmaHandle, ! 2906: IN PNDIS_BUFFER Buffer, ! 2907: IN ULONG Offset, ! 2908: IN ULONG Length, ! 2909: IN BOOLEAN WriteToDevice ! 2910: ); ! 2911: ! 2912: VOID ! 2913: NdisCompleteDmaTransfer( ! 2914: OUT PNDIS_STATUS Status, ! 2915: IN PNDIS_HANDLE NdisDmaHandle, ! 2916: IN PNDIS_BUFFER Buffer, ! 2917: IN ULONG Offset, ! 2918: IN ULONG Length, ! 2919: IN BOOLEAN WriteToDevice ! 2920: ); ! 2921: ! 2922: /*++ ! 2923: ULONG ! 2924: NdisReadDmaCounter( ! 2925: IN NDIS_HANDLE NdisDmaHandle ! 2926: ) ! 2927: --*/ ! 2928: ! 2929: #define NdisReadDmaCounter(_NdisDmaHandle) \ ! 2930: HalReadDmaCounter(((PNDIS_DMA_BLOCK)(_NdisDmaHandle))->SystemAdapterObject) ! 2931: ! 2932: ! 2933: ! 2934: // ! 2935: // Requests used by Protocol Modules ! 2936: // ! 2937: ! 2938: ! 2939: ! 2940: VOID ! 2941: NdisRegisterProtocol( ! 2942: OUT PNDIS_STATUS Status, ! 2943: OUT PNDIS_HANDLE NdisProtocolHandle, ! 2944: IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics, ! 2945: IN UINT CharacteristicsLength ! 2946: ); ! 2947: ! 2948: VOID ! 2949: NdisDeregisterProtocol( ! 2950: OUT PNDIS_STATUS Status, ! 2951: IN NDIS_HANDLE NdisProtocolHandle ! 2952: ); ! 2953: ! 2954: ! 2955: VOID ! 2956: NdisOpenAdapter( ! 2957: OUT PNDIS_STATUS Status, ! 2958: OUT PNDIS_STATUS OpenErrorStatus, ! 2959: OUT PNDIS_HANDLE NdisBindingHandle, ! 2960: OUT PUINT SelectedMediumIndex, ! 2961: IN PNDIS_MEDIUM MediumArray, ! 2962: IN UINT MediumArraySize, ! 2963: IN NDIS_HANDLE NdisProtocolHandle, ! 2964: IN NDIS_HANDLE ProtocolBindingContext, ! 2965: IN PNDIS_STRING AdapterName, ! 2966: IN UINT OpenOptions, ! 2967: IN PSTRING AddressingInformation OPTIONAL ! 2968: ); ! 2969: ! 2970: ! 2971: VOID ! 2972: NdisCloseAdapter( ! 2973: OUT PNDIS_STATUS Status, ! 2974: IN NDIS_HANDLE NdisBindingHandle ! 2975: ); ! 2976: ! 2977: ! 2978: #ifdef NDISDBG ! 2979: VOID ! 2980: NdisSend( ! 2981: OUT PNDIS_STATUS Status, ! 2982: IN NDIS_HANDLE NdisBindingHandle, ! 2983: IN PNDIS_PACKET Packet ! 2984: ); ! 2985: #else ! 2986: #define NdisSend(Status, \ ! 2987: NdisBindingHandle, \ ! 2988: Packet \ ! 2989: ) \ ! 2990: {\ ! 2991: *(Status) = \ ! 2992: (((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->SendHandler) ( \ ! 2993: ((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->MacBindingHandle, \ ! 2994: (Packet)); \ ! 2995: } ! 2996: #endif ! 2997: ! 2998: ! 2999: #ifdef NDISDBG ! 3000: VOID ! 3001: NdisTransferData( ! 3002: OUT PNDIS_STATUS Status, ! 3003: IN NDIS_HANDLE NdisBindingHandle, ! 3004: IN NDIS_HANDLE MacReceiveContext, ! 3005: IN UINT ByteOffset, ! 3006: IN UINT BytesToTransfer, ! 3007: IN OUT PNDIS_PACKET Packet, ! 3008: OUT PUINT BytesTransferred ! 3009: ); ! 3010: #else ! 3011: #define NdisTransferData( \ ! 3012: Status, \ ! 3013: NdisBindingHandle, \ ! 3014: MacReceiveContext, \ ! 3015: ByteOffset, \ ! 3016: BytesToTransfer, \ ! 3017: Packet, \ ! 3018: BytesTransferred \ ! 3019: ) \ ! 3020: {\ ! 3021: *(Status) = \ ! 3022: (((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->TransferDataHandler) ( \ ! 3023: ((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->MacBindingHandle, \ ! 3024: (MacReceiveContext), \ ! 3025: (ByteOffset), \ ! 3026: (BytesToTransfer), \ ! 3027: (Packet), \ ! 3028: (BytesTransferred)); \ ! 3029: } ! 3030: #endif ! 3031: ! 3032: ! 3033: #ifdef NDISDBG ! 3034: VOID ! 3035: NdisReset( ! 3036: OUT PNDIS_STATUS Status, ! 3037: IN NDIS_HANDLE NdisBindingHandle ! 3038: ); ! 3039: #else ! 3040: #define NdisReset( \ ! 3041: Status, \ ! 3042: NdisBindingHandle \ ! 3043: ) \ ! 3044: { \ ! 3045: *(Status) = \ ! 3046: (((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->MacHandle->MacCharacteristics.ResetHandler) ( \ ! 3047: ((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->MacBindingHandle); \ ! 3048: } ! 3049: #endif ! 3050: ! 3051: #ifdef NDISDBG ! 3052: VOID ! 3053: NdisRequest( ! 3054: OUT PNDIS_STATUS Status, ! 3055: IN NDIS_HANDLE NdisBindingHandle, ! 3056: IN PNDIS_REQUEST NdisRequest ! 3057: ); ! 3058: #else ! 3059: #define NdisRequest( \ ! 3060: Status,\ ! 3061: NdisBindingHandle, \ ! 3062: NdisRequest \ ! 3063: ) \ ! 3064: { \ ! 3065: *(Status) = \ ! 3066: (((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->MacHandle->MacCharacteristics.RequestHandler) ( \ ! 3067: ((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->MacBindingHandle, \ ! 3068: (NdisRequest)); \ ! 3069: } ! 3070: #endif ! 3071: ! 3072: // ! 3073: // Requests Used by MAC Drivers ! 3074: // ! 3075: ! 3076: extern PDRIVER_OBJECT Driver; // set by initialization routine ! 3077: ! 3078: ! 3079: VOID ! 3080: NdisInitializeWrapper( ! 3081: OUT PNDIS_HANDLE NdisWrapperHandle, ! 3082: IN PVOID SystemSpecific1, ! 3083: IN PVOID SystemSpecific2, ! 3084: IN PVOID SystemSpecific3 ! 3085: ); ! 3086: ! 3087: ! 3088: VOID ! 3089: NdisTerminateWrapper( ! 3090: IN NDIS_HANDLE NdisWrapperHandle, ! 3091: IN PVOID SystemSpecific ! 3092: ); ! 3093: ! 3094: VOID ! 3095: NdisRegisterMac( ! 3096: OUT PNDIS_STATUS Status, ! 3097: OUT PNDIS_HANDLE NdisMacHandle, ! 3098: IN NDIS_HANDLE NdisWrapperHandle, ! 3099: IN NDIS_HANDLE MacMacContext, ! 3100: IN PNDIS_MAC_CHARACTERISTICS MacCharacteristics, ! 3101: IN UINT CharacteristicsLength ! 3102: ); ! 3103: ! 3104: VOID ! 3105: NdisDeregisterMac( ! 3106: OUT PNDIS_STATUS Status, ! 3107: IN NDIS_HANDLE NdisMacHandle ! 3108: ); ! 3109: ! 3110: ! 3111: NDIS_STATUS ! 3112: NdisRegisterAdapter( ! 3113: OUT PNDIS_HANDLE NdisAdapterHandle, ! 3114: IN NDIS_HANDLE NdisMacHandle, ! 3115: IN NDIS_HANDLE MacAdapterContext, ! 3116: IN NDIS_HANDLE WrapperConfigurationContext, ! 3117: IN PNDIS_STRING AdapterName, ! 3118: IN PVOID AdapterInformation ! 3119: ); ! 3120: ! 3121: NDIS_STATUS ! 3122: NdisDeregisterAdapter( ! 3123: IN NDIS_HANDLE NdisAdapterHandle ! 3124: ); ! 3125: ! 3126: VOID ! 3127: NdisRegisterAdapterShutdownHandler( ! 3128: IN NDIS_HANDLE NdisAdapterHandle, ! 3129: IN PVOID ShutdownContext, ! 3130: IN ADAPTER_SHUTDOWN_HANDLER ShutdownHandler ! 3131: ); ! 3132: ! 3133: VOID ! 3134: NdisDeregisterAdapterShutdownHandler( ! 3135: IN NDIS_HANDLE NdisAdapterHandle ! 3136: ); ! 3137: ! 3138: VOID ! 3139: NdisReleaseAdapterResources( ! 3140: IN NDIS_HANDLE NdisAdapterHandle ! 3141: ); ! 3142: ! 3143: VOID ! 3144: NdisWriteErrorLogEntry( ! 3145: IN NDIS_HANDLE NdisAdapterHandle, ! 3146: IN NDIS_ERROR_CODE ErrorCode, ! 3147: IN ULONG NumberOfErrorValues, ! 3148: ... ! 3149: ); ! 3150: ! 3151: VOID ! 3152: NdisCompleteOpenAdapter( ! 3153: IN NDIS_HANDLE NdisBindingContext, ! 3154: IN NDIS_STATUS Status, ! 3155: IN NDIS_STATUS OpenErrorStatus ! 3156: ); ! 3157: ! 3158: ! 3159: VOID ! 3160: NdisCompleteCloseAdapter( ! 3161: IN NDIS_HANDLE NdisBindingContext, ! 3162: IN NDIS_STATUS Status ! 3163: ); ! 3164: ! 3165: ! 3166: #ifdef NDISDBG ! 3167: VOID ! 3168: NdisCompleteSend( ! 3169: IN NDIS_HANDLE NdisBindingContext, ! 3170: IN PNDIS_PACKET Packet, ! 3171: IN NDIS_STATUS Status ! 3172: ); ! 3173: #else ! 3174: #define NdisCompleteSend( \ ! 3175: NdisBindingContext, \ ! 3176: Packet, \ ! 3177: Status \ ! 3178: ) \ ! 3179: {\ ! 3180: (((PNDIS_OPEN_BLOCK)(NdisBindingContext))->SendCompleteHandler) ( \ ! 3181: ((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ProtocolBindingContext, \ ! 3182: (Packet), \ ! 3183: (Status)); \ ! 3184: } ! 3185: #endif ! 3186: ! 3187: ! 3188: #ifdef NDISDBG ! 3189: VOID ! 3190: NdisCompleteTransferData( ! 3191: IN NDIS_HANDLE NdisBindingContext, ! 3192: IN PNDIS_PACKET Packet, ! 3193: IN NDIS_STATUS Status, ! 3194: IN UINT BytesTransferred ! 3195: ); ! 3196: #else ! 3197: #define NdisCompleteTransferData( \ ! 3198: NdisBindingContext, \ ! 3199: Packet, \ ! 3200: Status, \ ! 3201: BytesTransferred \ ! 3202: ) \ ! 3203: {\ ! 3204: (((PNDIS_OPEN_BLOCK)(NdisBindingContext))->TransferDataCompleteHandler) ( \ ! 3205: ((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ProtocolBindingContext, \ ! 3206: (Packet), \ ! 3207: (Status), \ ! 3208: (BytesTransferred)); \ ! 3209: } ! 3210: #endif ! 3211: ! 3212: #ifdef NDISDBG ! 3213: VOID ! 3214: NdisCompleteReset( ! 3215: IN NDIS_HANDLE NdisBindingContext, ! 3216: IN NDIS_STATUS Status ! 3217: ); ! 3218: #else ! 3219: #define NdisCompleteReset( \ ! 3220: NdisBindingContext, \ ! 3221: Status \ ! 3222: ) \ ! 3223: { \ ! 3224: (((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ProtocolHandle->ProtocolCharacteristics.ResetCompleteHandler) ( \ ! 3225: ((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ProtocolBindingContext, \ ! 3226: Status); \ ! 3227: } ! 3228: #endif ! 3229: ! 3230: ! 3231: #ifdef NDISDBG ! 3232: VOID ! 3233: NdisCompleteRequest( ! 3234: IN NDIS_HANDLE NdisBindingContext, ! 3235: IN PNDIS_REQUEST NdisRequest, ! 3236: IN NDIS_STATUS Status ! 3237: ); ! 3238: #else ! 3239: #define NdisCompleteRequest( \ ! 3240: NdisBindingContext, \ ! 3241: NdisRequest, \ ! 3242: Status) \ ! 3243: { \ ! 3244: (((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ProtocolHandle->ProtocolCharacteristics.RequestCompleteHandler) ( \ ! 3245: ((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ProtocolBindingContext, \ ! 3246: NdisRequest, \ ! 3247: Status); \ ! 3248: } ! 3249: #endif ! 3250: ! 3251: #ifdef NDISDBG ! 3252: VOID ! 3253: NdisIndicateReceive( ! 3254: OUT PNDIS_STATUS Status, ! 3255: IN NDIS_HANDLE NdisBindingContext, ! 3256: IN NDIS_HANDLE MacReceiveContext, ! 3257: IN PVOID HeaderBuffer, ! 3258: IN UINT HeaderBufferSize, ! 3259: IN PVOID LookaheadBuffer, ! 3260: IN UINT LookaheadBufferSize, ! 3261: IN UINT PacketSize ! 3262: ); ! 3263: #else ! 3264: #define NdisIndicateReceive( \ ! 3265: Status, \ ! 3266: NdisBindingContext, \ ! 3267: MacReceiveContext, \ ! 3268: HeaderBuffer, \ ! 3269: HeaderBufferSize, \ ! 3270: LookaheadBuffer, \ ! 3271: LookaheadBufferSize, \ ! 3272: PacketSize \ ! 3273: ) \ ! 3274: {\ ! 3275: *(Status) = \ ! 3276: (((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ReceiveHandler) ( \ ! 3277: ((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ProtocolBindingContext, \ ! 3278: (MacReceiveContext), \ ! 3279: (HeaderBuffer), \ ! 3280: (HeaderBufferSize), \ ! 3281: (LookaheadBuffer), \ ! 3282: (LookaheadBufferSize), \ ! 3283: (PacketSize)); \ ! 3284: } ! 3285: #endif ! 3286: ! 3287: ! 3288: #ifdef NDISDBG ! 3289: VOID ! 3290: NdisIndicateReceiveComplete( ! 3291: IN NDIS_HANDLE NdisBindingContext ! 3292: ); ! 3293: #else ! 3294: #define NdisIndicateReceiveComplete( \ ! 3295: NdisBindingContext \ ! 3296: ) \ ! 3297: (((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ReceiveCompleteHandler) ( \ ! 3298: ((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ProtocolBindingContext); ! 3299: #endif ! 3300: ! 3301: ! 3302: #ifdef NDISDBG ! 3303: VOID ! 3304: NdisIndicateStatus( ! 3305: IN NDIS_HANDLE NdisBindingContext, ! 3306: IN NDIS_STATUS GeneralStatus, ! 3307: IN PVOID StatusBuffer, ! 3308: IN UINT StatusBufferSize ! 3309: ); ! 3310: #else ! 3311: #define NdisIndicateStatus( \ ! 3312: NdisBindingContext, \ ! 3313: GeneralStatus, \ ! 3314: StatusBuffer, \ ! 3315: StatusBufferSize \ ! 3316: ) \ ! 3317: {\ ! 3318: (((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ProtocolHandle->ProtocolCharacteristics.StatusHandler) ( \ ! 3319: ((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ProtocolBindingContext, \ ! 3320: (GeneralStatus), \ ! 3321: (StatusBuffer), \ ! 3322: (StatusBufferSize)); \ ! 3323: } ! 3324: #endif ! 3325: ! 3326: ! 3327: #ifdef NDISDBG ! 3328: VOID ! 3329: NdisIndicateStatusComplete( ! 3330: IN NDIS_HANDLE NdisBindingContext ! 3331: ); ! 3332: #else ! 3333: #define NdisIndicateStatusComplete( \ ! 3334: NdisBindingContext \ ! 3335: ) \ ! 3336: { \ ! 3337: (((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ProtocolHandle->ProtocolCharacteristics.StatusCompleteHandler) ( \ ! 3338: ((PNDIS_OPEN_BLOCK)(NdisBindingContext))->ProtocolBindingContext); \ ! 3339: } ! 3340: #endif ! 3341: ! 3342: VOID ! 3343: NdisCompleteQueryStatistics( ! 3344: IN NDIS_HANDLE NdisAdapterHandle, ! 3345: IN PNDIS_REQUEST NdisRequest, ! 3346: IN NDIS_STATUS Status ! 3347: ); ! 3348: ! 3349: #define NdisInitializeString(Destination,Source) \ ! 3350: {\ ! 3351: PNDIS_STRING _D = (Destination);\ ! 3352: UCHAR *_S = (Source);\ ! 3353: WCHAR *_P;\ ! 3354: _D->Length = (strlen(_S)) * sizeof(WCHAR);\ ! 3355: _D->MaximumLength = _D->Length + sizeof(WCHAR);\ ! 3356: NdisAllocateMemory((PVOID *)&(_D->Buffer), _D->MaximumLength, 0, (-1));\ ! 3357: _P = _D->Buffer;\ ! 3358: while(*_S != '\0'){\ ! 3359: *_P = (WCHAR)(*_S);\ ! 3360: _S++;\ ! 3361: _P++;\ ! 3362: }\ ! 3363: *_P = UNICODE_NULL;\ ! 3364: } ! 3365: ! 3366: ! 3367: #define NdisFreeString(String) NdisFreeMemory((String).Buffer, (String).MaximumLength, 0) ! 3368: ! 3369: #define NdisPrintString(String) DbgPrint("%ls",(String).Buffer) ! 3370: ! 3371: ! 3372: #ifdef _M_IX86 ! 3373: /*++ ! 3374: ! 3375: VOID ! 3376: NdisCreateLookaheadBufferFromSharedMemory( ! 3377: IN PVOID pSharedMemory, ! 3378: IN UINT LookaheadLength, ! 3379: OUT PVOID *pLookaheadBuffer ! 3380: ); ! 3381: ! 3382: --*/ ! 3383: ! 3384: #define NdisCreateLookaheadBufferFromSharedMemory(_S, _L, _B) \ ! 3385: ((*(_B)) = (_S)) ! 3386: ! 3387: ! 3388: ! 3389: /*++ ! 3390: ! 3391: VOID ! 3392: NdisDestroyLookaheadBufferFromSharedMemory( ! 3393: IN PVOID pLookaheadBuffer ! 3394: ); ! 3395: ! 3396: --*/ ! 3397: ! 3398: #define NdisDestroyLookaheadBufferFromSharedMemory(_B) ! 3399: ! 3400: #else ! 3401: #ifdef mips ! 3402: ! 3403: /*++ ! 3404: ! 3405: VOID ! 3406: NdisCreateLookaheadBufferFromSharedMemory( ! 3407: IN PVOID pSharedMemory, ! 3408: IN UINT LookaheadLength, ! 3409: OUT PVOID *pLookaheadBuffer ! 3410: ); ! 3411: ! 3412: --*/ ! 3413: ! 3414: #define NdisCreateLookaheadBufferFromSharedMemory(_S, _L, _B) \ ! 3415: ((*(_B)) = (_S)) ! 3416: ! 3417: ! 3418: ! 3419: /*++ ! 3420: ! 3421: VOID ! 3422: NdisDestroyLookaheadBufferFromSharedMemory( ! 3423: IN PVOID pLookaheadBuffer ! 3424: ); ! 3425: ! 3426: --*/ ! 3427: ! 3428: #define NdisDestroyLookaheadBufferFromSharedMemory(_B) ! 3429: ! 3430: #else ! 3431: ! 3432: VOID ! 3433: NdisCreateLookaheadBufferFromSharedMemory( ! 3434: IN PVOID pSharedMemory, ! 3435: IN UINT LookaheadLength, ! 3436: OUT PVOID *pLookaheadBuffer ! 3437: ); ! 3438: ! 3439: VOID ! 3440: NdisDestroyLookaheadBufferFromSharedMemory( ! 3441: IN PVOID pLookaheadBuffer ! 3442: ); ! 3443: ! 3444: #endif // mips ! 3445: #endif // i386 ! 3446: ! 3447: ! 3448: // ! 3449: //*\\ Stubs to compile with Ndis 3.0 Kernel ! 3450: // ! 3451: ! 3452: extern ! 3453: NDIS_STATUS ! 3454: EthAddFilterAddress(); ! 3455: ! 3456: extern ! 3457: NDIS_STATUS ! 3458: EthDeleteFilterAddress(); ! 3459: ! 3460: extern ! 3461: NDIS_STATUS ! 3462: NdisInitializePacketPool(); ! 3463: ! 3464: // ZZZZ ! 3465: ! 3466: #ifdef NDISDBG ! 3467: VOID ! 3468: DbgChkPktLength( ! 3469: IN PNDIS_PACKET Packet ! 3470: ); ! 3471: #endif ! 3472: ! 3473: #endif // _NDIS_
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.