16#define SROM_READ(Adapter, Data) \
18 *Data = DC_READ((Adapter), DcCsr9_SerialInterface); \
19 NdisStallExecution(10); \
22#define SROM_WRITE(Adapter, Value) \
24 DC_WRITE((Adapter), DcCsr9_SerialInterface, Value); \
25 NdisStallExecution(10); \
76 PrevEntry = PrevEntry->
Blink)
80 if ((SRomEntry->
ChipType == Adapter->ChipType) &&
81 (SRomEntry->
BusNumber == Adapter->BusNumber) &&
82 (!SearchForMaster || (SRomEntry->
DeviceNumber == Adapter->DeviceNumber)))
85 *FoundEntry = SRomEntry;
114 Adapter->SRomEntry = SRomEntry;
116 SRomEntry->ChipType = Adapter->ChipType;
117 SRomEntry->BusNumber = Adapter->BusNumber;
118 SRomEntry->DeviceNumber = Adapter->DeviceNumber;
119 SRomEntry->InterruptLevel = Adapter->InterruptLevel;
120 SRomEntry->InterruptVector = Adapter->InterruptVector;
123 SRomEntry->DeviceBitmap |= 1 << Adapter->DeviceNumber;
159 Adapter->SRomEntry = SRomEntry;
170 if (
i == Adapter->DeviceNumber)
174 ++Adapter->ControllerIndex;
186 WARN(
"EEPROM is missing on controller %u, using image from the master at %u:%u\n",
187 Adapter->DeviceNumber,
191 *FoundEntry = SRomEntry;
215 if (FirstByte !=
Data[
i])
263 ULONG MediaCode, OpMode;
268 if (BlockData > (SRomEnd - 4))
274 WARN(
"Unknown media code %u\n", MediaCode);
277 Adapter->MediaBitmap |= 1 << MediaCode;
279 Media = &Adapter->Media[MediaCode];
286 OpMode &= ~SROM_OPMODE_MASK;
299 INFO(
"GPR #%u %s, Command %04lx, Data %02lx\n",
319 UCHAR PhyNumber, StreamLength, InterruptInfo;
324 if (BlockData > (SRomEnd - 2))
327 PhyNumber = *BlockData++;
336 WARN(
"Unsupported PHY %u\n", PhyNumber);
340 Media = &Adapter->MiiMedia;
346 StreamLength = *BlockData++;
349 WARN(
"Too much registers %u\n", StreamLength);
353 Bytes = StreamLength;
359 if ((BlockData +
Bytes) > (SRomEnd - 1))
377 for (
i = 0;
i < StreamLength; ++
i)
386 BlockData +=
sizeof(
USHORT);
394 if (BlockData > (SRomEnd - 1))
399 StreamLength = *BlockData++;
402 WARN(
"Too much registers %u\n", StreamLength);
406 Bytes = StreamLength;
412 if ((BlockData +
Bytes) > (SRomEnd - 1))
419 for (
i = 0;
i < StreamLength; ++
i)
428 BlockData +=
sizeof(
USHORT);
441 if (BlockData > (SRomEnd -
Bytes))
447 BlockData +=
sizeof(
USHORT);
450 BlockData +=
sizeof(
USHORT);
453 BlockData +=
sizeof(
USHORT);
456 BlockData +=
sizeof(
USHORT);
458 InterruptInfo = IsOldVersion ? 0 : *BlockData;
462 INFO(
"MII #%u, Caps %04lx, Adv %04lx, Fdx %04lx, Ttm %04lx, Int %02x\n",
488 if (BlockData > (SRomEnd - 1))
491 BlockStart = *BlockData++;
494 if (BlockData > (SRomEnd - (HasExtendedData ? 10 : 4)))
500 WARN(
"Unknown media code %u\n", MediaCode);
507 ERR(
"FIXME: 21143 HMR is not supported yet\n");
517 Adapter->MediaBitmap |= 1 << MediaCode;
519 Media = &Adapter->Media[MediaCode];
524 BlockData +=
sizeof(
USHORT);
527 BlockData +=
sizeof(
USHORT);
530 BlockData +=
sizeof(
USHORT);
534 BlockData +=
sizeof(
USHORT);
537 BlockData +=
sizeof(
USHORT);
541 INFO(
"SIA #%u %s, %sCSR13 %04lx CSR14 %04lx CSR15 %04lx, "
542 "Ctrl %04lx, Data %04lx\n",
545 HasExtendedData ?
"EXT " :
"",
564 ULONG MediaCode, OpMode;
569 if (BlockData > (SRomEnd - 7))
575 WARN(
"Unknown media code %u\n", MediaCode);
578 Adapter->MediaBitmap |= 1 << MediaCode;
580 Media = &Adapter->Media[MediaCode];
583 BlockData +=
sizeof(
USHORT);
586 BlockData +=
sizeof(
USHORT);
589 BlockData +=
sizeof(
USHORT);
592 OpMode &= ~SROM_OPMODE_MASK;
598 INFO(
"SYM #%u %s, Command %04lx, Ctrl %04lx, Data %04lx\n",
620 if (BlockData > (SRomEnd - 1))
623 StreamLength = *BlockData++;
626 WARN(
"Too much registers %u\n", StreamLength);
630 if ((BlockData + StreamLength * 2) > (SRomEnd - 1))
633 Adapter->ResetStreamLength = StreamLength;
635 for (
i = 0;
i < StreamLength; ++
i)
638 BlockData +=
sizeof(
USHORT);
641 INFO(
"RESET, length %u\n", StreamLength);
659 if (BlockData > (SRomEnd - (2 + 6)))
663 BlockData +=
sizeof(
USHORT);
667 Adapter->HpnaRegister[
HPNA_NOISE] = *BlockData++;
679 ExtraData = (BlockLength -
Offset);
681 if ((BlockData + ExtraData) > (SRomEnd - 1))
684 for (
i = 0;
i < ExtraData /
sizeof(
USHORT); ++
i)
687 UCHAR RegValue = *BlockData++;
689 Adapter->HpnaRegister[RegAddress] = RegValue;
690 Adapter->HpnaInitBitmap |= 1 << RegAddress;
694 INFO_VERB(
"Analog Ctrl %04lx\n", Adapter->AnalogControl);
698 if (Adapter->HpnaInitBitmap & (1 <<
i))
700 INFO_VERB(
"HR Reg %02x = %02x\n",
i, Adapter->HpnaRegister[
i]);
704 if (ExtraData %
sizeof(
USHORT))
706 INFO_VERB(
"HR Data = %02x\n", *BlockData);
727 if (BlockData > (SRomEnd - 2))
787 if (BlockData > (SRomEnd - 1))
790 BlockStart = *BlockData++;
793 if (BlockData > (SRomEnd - (HasExtendedData ? 7 : 1)))
796 *BlockSize = HasExtendedData ? 7 : 1;
801 WARN(
"Unknown media code %u\n", MediaCode);
804 Adapter->MediaBitmap |= 1 << MediaCode;
806 Media = &Adapter->Media[MediaCode];
811 BlockData +=
sizeof(
USHORT);
814 BlockData +=
sizeof(
USHORT);
817 BlockData +=
sizeof(
USHORT);
820 INFO(
"SIA #%u %s, %sCSR13 %04lx CSR14 %04lx CSR15 %04lx\n",
823 HasExtendedData ?
"EXT " :
"",
858 const UCHAR* Octet = AddressRom;
868 for (
i = 0;
i < 8; ++
i)
870 if (Octet[
i] != Octet[15 -
i])
874 Checksum = (Octet[0] << 10) + (Octet[2] << 9) + (Octet[4] << 8) +
875 (Octet[1] << 2) + (Octet[3] << 1) + Octet[5];
878 return ((
USHORT)Checksum == ((Octet[6] << 8) | Octet[7]));
899 ERR(
"EAR has an invalid checksum\n");
908 if (Adapter->ChipType !=
DC21040)
922 WARN(
"Legacy/unknown board found\n");
927 *AddressOffset = MacOffset;
945 ULONG i, MacOffset, LeafOffset;
951 ERR(
"Unable to read the MAC address\n");
964 if ((Adapter->PermanentMacAddress[0] == 0xE8) && (SRom[0x1A] == 0x55))
972 ERR(
"Non-standard SROM format, OUI %02x:%02x:%02x\n",
973 Adapter->PermanentMacAddress[0],
974 Adapter->PermanentMacAddress[1],
975 Adapter->PermanentMacAddress[2]);
984 Adapter->PermanentMacAddress[5] += Adapter->ControllerIndex;
995 INFO(
"Multiport board, controller number %u (%u/%u)\n",
996 Adapter->DeviceNumber,
997 Adapter->ControllerIndex + 1,
1010 ERR(
"Controller %u was not found in the SROM\n", Adapter->DeviceNumber);
1018 Adapter->PermanentMacAddress[5] +=
i;
1031 *InfoLeaf = &SRom[LeafOffset];
1045 ULONG Index, BlockCount, BlockSize, DefaultMedia;
1052 INFO(
"SROM Version %u, Controller count %u\n",
1063 INFO(
"Default Media: %04lx\n", DefaultMedia);
1066 if (Adapter->ChipType ==
DC21140)
1070 INFO(
"GPIO Direction: %04lx\n", GpioCtrl);
1076 Adapter->Media[
Index].GpioCtrl = GpioCtrl;
1080 Adapter->MiiMedia.SetupStream[0] = GpioCtrl;
1083 BlockCount = *
Data++;
1085 INFO(
"Block Count: %u\n", BlockCount);
1087 if (BlockCount == 0 || BlockCount == 0xFF)
1089 WARN(
"No media information found\n");
1096 if (Adapter->ChipType ==
DC21041)
1102 if (
Data > (SRomEnd - 1))
1121 if ((Adapter->MediaBitmap == 0) && !(Adapter->Features &
DC_HAS_MII))
1123 WARN(
"No media information found\n");
1141 for (
i = BitCount - 1;
i >= 0; --
i)
1315 ReleaseImage =
FALSE;
1320 ReleaseImage =
TRUE;
1328 ERR(
"Failed to retrieve the SROM contents\n");
1336 ERR(
"Failed to parse SROM\n");
1366 for (
j = 10000;
j > 0; --
j)
1402 ReleaseImage =
FALSE;
1407 ReleaseImage =
TRUE;
1415 ERR(
"Failed to retrieve the EAR contents\n");
1422 ERR(
"Unable to read the MAC address\n");
1427 Adapter->PermanentMacAddress[5] += Adapter->ControllerIndex;
1451 SRomEntry = Adapter->SRomEntry;
1458 SRomEntry->
DeviceBitmap &= ~(1 << Adapter->DeviceNumber);
1467 INFO(
"Freeing SROM %p at %u:%u\n",
1489 if (Adapter->ChipType ==
DC21040)
1503 INFO(
"MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
1504 Adapter->PermanentMacAddress[0],
1505 Adapter->PermanentMacAddress[1],
1506 Adapter->PermanentMacAddress[2],
1507 Adapter->PermanentMacAddress[3],
1508 Adapter->PermanentMacAddress[4],
1509 Adapter->PermanentMacAddress[5]);
1515 ERR(
"Invalid permanent MAC address %02x:%02x:%02x:%02x:%02x:%02x\n",
1516 Adapter->PermanentMacAddress[0],
1517 Adapter->PermanentMacAddress[1],
1518 Adapter->PermanentMacAddress[2],
1519 Adapter->PermanentMacAddress[3],
1520 Adapter->PermanentMacAddress[4],
1521 Adapter->PermanentMacAddress[5]);
FORCEINLINE ULONG DC_READ(_In_ PDC21X4_ADAPTER Adapter, _In_ DC_CSR Register)
#define DC_WRITE(Adapter, Register, Value)
#define DC_SERIAL_EE_DI_SHIFT
#define DC_SERIAL_EE_DO_SHIFT
#define HPNA_NOISE_ATTACK
#define HPNA_NOISE_CEILING
#define HPNA_CONTROL_HIGH
FORCEINLINE USHORT DcRetrieveWord(_In_ const VOID *Data)
#define ETH_IS_EMPTY(Address)
VOID _cdecl NdisWriteErrorLogEntry(IN NDIS_HANDLE NdisAdapterHandle, IN NDIS_ERROR_CODE ErrorCode, IN ULONG NumberOfErrorValues,...)
VOID EXPORT NdisFreeMemory(IN PVOID VirtualAddress, IN UINT Length, IN UINT MemoryFlags)
NDIS_STATUS EXPORT NdisAllocateMemoryWithTag(OUT PVOID *VirtualAddress, IN UINT Length, IN ULONG Tag)
static BOOLEAN SRomIsEmpty(_In_reads_bytes_(Length) const VOID *Buffer, _In_ ULONG Length)
LIST_ENTRY SRompAdapterList
static NDIS_STATUS SRomDecodeBlockHmr(_In_ PDC21X4_ADAPTER Adapter, _In_ PUCHAR SRomEnd, _In_ PUCHAR BlockData, _In_ UCHAR BlockLength)
static NDIS_STATUS SRomParseExtendedBlock(_In_ PDC21X4_ADAPTER Adapter, _In_ PUCHAR SRomEnd, _In_ PUCHAR BlockData, _Out_ PULONG BlockSize)
static BOOLEAN SRomChecksumValid(_In_ PUCHAR SRom)
static BOOLEAN SRomReadMacAddress(_In_ PDC21X4_ADAPTER Adapter, _In_ PUCHAR SRom, _Out_opt_ PULONG AddressOffset)
static _Interlocked_ volatile LONG SRompAdapterLock
static BOOLEAN AddressRomChecksumValid(_In_reads_bytes_(EAR_SIZE) PVOID AddressRom)
static VOID SRomNWayAdvertise(_In_ PDC21X4_ADAPTER Adapter, _In_ ULONG MediaCode)
static NDIS_STATUS SRomParse(_In_ PDC21X4_ADAPTER Adapter, _In_ PUCHAR SRom)
DC_PG_DATA DC_SROM_REPAIR_ENTRY SRompRepairData[]
static USHORT SRomShiftIn(_In_ PDC21X4_ADAPTER Adapter)
static NDIS_STATUS SRomDecodeBlockGpr(_In_ PDC21X4_ADAPTER Adapter, _In_ PUCHAR SRomEnd, _In_ PUCHAR BlockData)
static ULONG SRomDetectAddressBusWidth(_In_ PDC21X4_ADAPTER Adapter)
static BOOLEAN SRomIsAdapterInList(_In_ PDC21X4_ADAPTER Adapter, _In_ BOOLEAN SearchForMaster, _Out_opt_ PDC_SROM_ENTRY *FoundEntry)
static VOID SRomShiftOut(_In_ PDC21X4_ADAPTER Adapter, _In_ ULONG Sequence, _In_ ULONG BitCount)
static NDIS_STATUS SRomDecodeBlockMii(_In_ PDC21X4_ADAPTER Adapter, _In_ PUCHAR SRomEnd, _In_ PUCHAR BlockData, _In_ BOOLEAN IsOldVersion)
static NDIS_STATUS SRomDecodeBlockReset(_In_ PDC21X4_ADAPTER Adapter, _In_ PUCHAR SRomEnd, _In_ PUCHAR BlockData)
static VOID SRomAcquireListMutex(VOID)
static NDIS_STATUS SRomParseHeader(_In_ PDC21X4_ADAPTER Adapter, _In_ PUCHAR SRom, _Out_ PUCHAR *InfoLeaf, _Out_ PUCHAR *SRomEnd)
static NDIS_STATUS SRomDecodeBlockSia(_In_ PDC21X4_ADAPTER Adapter, _In_ PUCHAR SRomEnd, _In_ PUCHAR BlockData)
static BOOLEAN SRomRegisterMasterAdapter(_In_ PDC21X4_ADAPTER Adapter, _In_ PDC_SROM_ENTRY SRomEntry)
#define SROM_WRITE(Adapter, Value)
static NDIS_STATUS SRomDecodeBlockSym(_In_ PDC21X4_ADAPTER Adapter, _In_ PUCHAR SRomEnd, _In_ PUCHAR BlockData)
static BOOLEAN AddressRomReadData(_In_ PDC21X4_ADAPTER Adapter, _Out_writes_all_(EAR_SIZE) PUCHAR AddressRom)
static NDIS_STATUS SRomRead(_In_ PDC21X4_ADAPTER Adapter)
#define SROM_READ(Adapter, Data)
static BOOLEAN SRomFindMasterAdapter(_In_ PDC21X4_ADAPTER Adapter, _Out_ PDC_SROM_ENTRY *FoundEntry)
NDIS_STATUS DcReadEeprom(_In_ PDC21X4_ADAPTER Adapter)
VOID DcFreeEeprom(_In_ PDC21X4_ADAPTER Adapter)
static NDIS_STATUS SRomParse21041Block(_In_ PDC21X4_ADAPTER Adapter, _In_ PUCHAR SRomEnd, _In_ PUCHAR BlockData, _Out_ PULONG BlockSize)
static NDIS_STATUS AddressRomRead(_In_ PDC21X4_ADAPTER Adapter)
static BOOLEAN SRomReadSRom(_In_ PDC21X4_ADAPTER Adapter, _Out_writes_all_(EE_SIZE) PVOID SRom)
static VOID SRomReleaseListMutex(VOID)
#define SRomBlockHasExtendedData(Byte)
#define EEPROM_CMD_LENGTH
#define SROM_CONTROLLER_COUNT
#define SRomHmrRegAddress(Byte)
#define SROM_LEAF_OFFSET(n)
#define SRomMediaActivityIsActiveLow(Word)
#define SROM_MAX_STREAM_REGS
#define SROM_BLOCK_TYPE_MII_2
#define SRomGetMediaCode(Byte)
#define SRomIsBlockExtended(Byte)
#define SRomCommandToOpMode(Word)
#define SROM_BLOCK_TYPE_HOMERUN
#define SRomMediaHasActivityIndicator(Word)
#define SRomMediaGetSenseMask(Word)
#define SROM_BLOCK_TYPE_SIA
#define SROM_BLOCK_TYPE_MII_1
#define SROM_BLOCK_TYPE_PHY_SHUTDOWN
#define SROM_BLOCK_TYPE_GPR
#define SROM_BLOCK_TYPE_RESET
#define SROM_BLOCK_TYPE_SYM
#define SRomGetExtendedBlockLength(Byte)
#define SROM_DEVICE_NUMBER(n)
#define ETH_LENGTH_OF_ADDRESS
#define RemoveEntryList(Entry)
#define InsertTailList(ListHead, Entry)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
_Must_inspect_result_ typedef _Out_ PHIDP_CAPS Capabilities
long __cdecl _InterlockedCompareExchange(_Interlocked_operand_ long volatile *_Destination, long _Exchange, long _Comparand)
long __cdecl _InterlockedDecrement(_Interlocked_operand_ long volatile *_Addend)
#define _In_reads_bytes_(size)
#define _Out_writes_all_(size)
#define NdisZeroMemory(Destination, Length)
#define NDIS_ERROR_CODE_NETWORK_ADDRESS
#define NDIS_STATUS_FAILURE
#define NDIS_STATUS_INVALID_ADDRESS
#define NdisStallExecution
#define NDIS_STATUS_SUCCESS
#define NDIS_STATUS_BUFFER_OVERFLOW
#define NdisEqualMemory(Source1, Source2, Length)
#define NDIS_STATUS_ADAPTER_NOT_FOUND
#define NdisMoveMemory(Destination, Source, Length)
#define NDIS_STATUS_RESOURCES
VOID EXPORT NdisMSleep(IN ULONG MicrosecondsToSleep)
#define RTL_BITS_OF(sizeOfArg)
_In_ ULONG _In_ ULONG Offset
_In_ ULONGLONG _In_ ULONGLONG _In_ BOOLEAN _In_opt_ ULONG _In_opt_ UCHAR _In_opt_ UCHAR BusWidth
_In_ ULONG _In_ ULONG _In_ ULONG Length
UCHAR SRomImage[ANYSIZE_ARRAY]
struct _LIST_ENTRY * Blink
#define FIELD_OFFSET(t, f)
#define CONTAINING_RECORD(address, type, field)
_In_ WDFCOLLECTION _In_ ULONG Index
#define ETH_IS_BROADCAST(Address)
#define ETH_IS_MULTICAST(Address)