int sock_recv_init (sock_type *s, void *space, unsigned len) { recv_buf *p = (recv_buf*) space; recv_data *r = (recv_data*) s->udp.rx_data; int i; WATT_ASSERT ((DWORD)len <= USHRT_MAX); memset (r, 0, s->udp.max_rx_data); /* clear Rx-buffer */ memset (p, 0, len); /* clear data area */ s->udp.protoHandler = (ProtoHandler) sock_recvdaemon; r->recv_sig = RECV_USED; r->recv_bufs = (BYTE*) p; r->recv_bufnum = (WORD) (len / sizeof(recv_buf)); if (s->udp.ip_type == UDP_PROTO) for (i = 0; i < r->recv_bufnum; i++, p++) p->buf_sig = RECV_UNUSED; return (0); }
static int setup_rmode_receiver (void) { WORD rx_seg, rx_ofs; WORD asmpkt_size_chk; int head_size = RX_ELEMENT_HEAD_SIZE; WATT_ASSERT (rm_base); WATT_ASSERT ((head_size % 4) == 0); rx_seg = _pkt_inf->rm_seg; rx_ofs = PktReceiver; #if 0 /* test */ printf ("PktReceiver @ %04X:%04X, ", rx_seg, PktReceiver); printf ("_asmpkt_inf @ %04X:%04X\n", rx_seg, (int)sizeof(real_stub_array)); #endif *(WORD*)&real_stub_array[asmpkt_inf+0] = sizeof(real_stub_array); *(WORD*)&real_stub_array[asmpkt_inf+2] = rx_seg; asmpkt_size_chk = *(WORD*) (real_stub_array + size_chk); if (asmpkt_size_chk != sizeof(PKT_INFO)) { TCP_CONSOLE_MSG (0, ("%s (%u): Development error:\n" " sizeof(pkt_info) = %ld in pcpkt.h\n" " sizeof(pkt_info) = %u in asmpkt.nas, (diff %ld)\n", __FILE__, __LINE__, (long)sizeof(PKT_INFO), asmpkt_size_chk, (long)(sizeof(PKT_INFO) - asmpkt_size_chk))); return (-1); } if (*(WORD*)&real_stub_array[PktReceiver] != 0xA80F || /* push gs */ *(WORD*)&real_stub_array[PktReceiver+2] != 0xA00F) /* push fs */ { TCP_CONSOLE_MSG (0, ("%s (%u): Development error:\n" " PktReceiver misaligned\n", __FILE__, __LINE__)); return (-1); } if (!has_rdtsc || !use_rdtsc) { DWORD patch_it = (*(WORD*) &real_stub_array[patch_nop]) + (DWORD) &real_stub_array; TCP_CONSOLE_MSG (4, ("patch_it (%04X): %02X,%02X,%02X\n", *(WORD*)&real_stub_array[patch_nop], ((BYTE*)patch_it)[0], ((BYTE*)patch_it)[1], ((BYTE*)patch_it)[2])); ((BYTE*)patch_it) [0] = 0x90; /* NOP */ ((BYTE*)patch_it) [1] = 0x90; ((BYTE*)patch_it) [2] = 0x90; } #if (DOSX & (PHARLAP|POWERPAK|X32VM)) WriteRealMem (rm_base, &real_stub_array, sizeof(real_stub_array)); #elif (DOSX & DJGPP) dosmemput (&real_stub_array, sizeof(real_stub_array), rm_base); #elif (DOSX & DOS4GW) || (DOSX == 0) memcpy ((void*)rm_base, &real_stub_array, sizeof(real_stub_array)); #else #error Help me! #endif return (0); }