3.2.3.4 Programmed I/O Device Initialization

A miniport that manages a PIO device performs sends and receives by writing and reading of data to and from a port range. To do this, the miniport must read the registry by making NdisXxxConfiguration calls or a bus-type-specific NdisXxx call, and then claim the I/O ports it requires by calling NdisMRegisterIoPortRange. Then the driver uses NdisMRead(Write)PortXxx calls to move data.

Unless the driver supports multipacket receive indications, any additional memory it needs to manage its device can be nonshared, allocated by calling NdisAllocateMemory.  If the driver indicates using NdisMIndicateReceivePacket, it must allocate at least one packet as described in Section 3.2.3.3.