One simple reason will be not enough pbufs allocated. Each received segment will take at lease one pbuf. Depending on the memory allocation scheme you have used each pbuf might be a pre-allocated size (say 1518 + header). In such a case each received segment in the win XP case will use a 1518 pbuf to store a 128 byte segment...it's easy to run out! For Win 7 you are less likely to run out since each segment is 536 so fewer pbufs are need to save the full payload.
(at lease this is my understanding of how TCP works in lwip - someone please correct me if I'm wrong!)
You can have dynamic pbuf allocation - slow but possibly better use of memory.
Pre-allocated fixed size pbufs pools - good performance but sizing pbufs to give optimal memory use is tricky.
custom pools i.e. varying size pre-allocated pbufs, picked based on best fit.
Which you select depends on your needs and sometimes the capability if the device driver (if it uses DMA then dynamic pbuf allocation may not be possible)